Python:从模块中唯一标识函数

时间:2012-09-14 02:27:39

标签: python

我不是一个程序员,而是一个计算统计学家,所以我可能理解复杂的算法而不是简单的编程结构。

我最初的问题是在函数内检查模块函数是否可调用。我环顾四周,决定去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。我发现这有点尴尬 - 有没有办法以编程方式避免这种阴影?

3 个答案:

答案 0 :(得分:3)

  

我最初的问题是在函数内检查模块函数是否可调用。

根据定义,所有函数都是可调用的。这将测试对象是否可调用:http://docs.python.org/library/functions.html#callable

  

因此,可以通过几种不同的方式调用相同的函数。

是的,但它将是同一个对象。您可以使用f is g来测试fg是否是同一个对象。

更新:为什么需要使用唯一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

您可以使用isid()轻松地看到它们具有相同的功能:

>>> 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),因此您可以“按需”加载或引用。

希望这会有所帮助。