我不是一个程序员,而是一个计算统计学家,所以我可能理解复杂的算法而不是简单的编程结构。
我最初的问题是在函数内检查模块函数是否可调用。我环顾四周,决定去try
(调用函数) - except
(导入模块)来简化它。我很乐意为此搜索sys.mod
,但我遇到了一些可识别问题。
我目前的问题是有很多方法可以从模块导入函数:import module
会将函数定义为module.function
,但from module import function
会将其定义为function
。更不用说from module import function as myfunction
了。因此,可以通过几种不同的方式调用相同的函数。
我的问题是:是否有一个独特的“签名”,如果加载了模块,可以跟踪一个函数?拥有实际的调用别名真是太棒了。
ps另外:mod
是数学函数,sys.mod
返回已加载模块的列表,但是当您通过执行内置mod
函数时,python(2.7)不会抱怨以下,from sys import mod
。我发现这有点尴尬 - 有没有办法以编程方式避免这种阴影?
答案 0 :(得分:3)
我最初的问题是在函数内检查模块函数是否可调用。
根据定义,所有函数都是可调用的。这将测试对象是否可调用:http://docs.python.org/library/functions.html#callable
因此,可以通过几种不同的方式调用相同的函数。
是的,但它将是同一个对象。您可以使用f is g
来测试f
和g
是否是同一个对象。
更新:为什么需要使用唯一ID?说真的,不要这样做。您有is
用于身份测试,__hash__
方法用于定义适用的哈希函数。
拥有实际的调用别名真是太好了。
根本不确定你的意思,但我认为你只想让它永远是一个对象。它已经是。
mod是数学函数,sys.mod返回已加载模块的列表,但python(2.7)不会从sys import mod中抱怨。我发现这有点尴尬?
然后不要这样做。您了解import ... as
语法。此外,mod
默认情况下不在全局命名空间中(操作符%
就是为此)。
最后,python会抱怨你的导入行:
>>> from sys import mod
Traceback (most recent call last):
File "<stdin>", line 1, in <module>
ImportError: cannot import name mod
(感谢有点指出这一点)。
答案 1 :(得分:1)
假设我有一个包含以下内容的模块:
def foo(): pass
bar = foo
您可以使用is
或id()
轻松地看到它们具有相同的功能:
>>> import demo
>>> from demo import *
>>> demo.foo is foo
True
>>> id(demo.foo) == id(foo)
True
>>> demo.bar is foo
True
它们都引用相同的代码对象,它只是在范围字典中以不同的名称存储。
答案 2 :(得分:0)
# define modulus f
def mod(a,b):
return b % a
print mod(5,2)
别名:
modulus=mod
print modulus(5,2)
这是非常pythonic构造,对于数学家来说非常直观
不同的导入方式可以帮助您将函数放入不同的“名称空间”以供以后在程序中使用,有时您希望使用很多函数,因此您可以选择较短的函数来编写。
您还可以执行以下操作:
myat=math.atanh
在另一个“名称空间”中创建别名
并将其用作:
myat(x)
因为它会使用math.atanh(x)
- 写得更短
典型的程序员方法将定义您想要使用的所有内容,然后使用它。你在我的信念中尝试的是“懒惰”=&gt;需要函数时导入模块。这就是为什么你想知道函数是否“可调用”的原因。
Python不是函数式编程语言(例如像haskel),因此您可以“按需”加载或引用。
希望这会有所帮助。