2012-09-14 28 views
2

我不是一个真正的程序员,而是一名计算统计学家,所以我可能会理解复杂的算法,但不是简单的编程构造。Python:从模块中唯一标识一个函数

我最初的问题是检查一个函数内是否可调用模块函数。我环顾四周,决定去找一个try(通话功能) - except(导入模块)来简化。我很乐意为此搜索sys.mod,但我遇到了一些识别问题。

我现在的问题是,有从模块导入函数的方法很多:import module将定义功能module.functionfrom module import function将其定义为function。更不用说from module import function as myfunction。因此可以用几种不同的方式调用相同的函数。

我的问题是:是否有一个独特的“签名”的功能,可以跟踪如果模块加载?具有实际的呼叫别名将会很棒。

除了PS:mod是数学函数和sys.mod回报加载的模块列表,但是Python(2.7)当你的影子不会抱怨内置mod功能通过执行以下,from sys import mod。我觉得这有点尴尬 - 是否有任何方法可以通过编程方式避免这种阴影?

+0

请使用顶部的格式化按钮,而不是制定自己的格式约定。 – Marcin

+3

“mod是数学函数”:在Python中,该mod拼写为'%'。 'mod'对Python没有特殊的内在含义。因此,从某个模块导入该名称没有问题。另外,没有'sys.mod'(尽管有'sys.modules')。 – kindall

+0

我很好奇你为什么需要检查模块函数是否可调用。这可能不是你最初的问题。 – Keith

回答

3

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

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

因此,可以用几种不同的方式调用同一个函数。

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

更新:为什么你需要使用唯一的ID?严重的是,不要这样做。您有用于身份测试的is,以及用于定义散列函数的__hash__方法。

如果有实际的呼叫别名,这将是太棒了。

根本不确定你的意思,但我认为你只是希望它永远是一个对象。它已经是。

mod是数学函数,sys.mod返回已加载模块的列表,但python(2.7)不会从sys导入mod中投诉。我觉得这有点尴尬?

然后不要这样做。你知道import ... as语法。在全局命名空间中也不默认mod(运营商%是为此)。

最后,蟒蛇不抱怨你的导入行:

>>> from sys import mod 
Traceback (most recent call last): 
    File "<stdin>", line 1, in <module> 
ImportError: cannot import name mod 

(感谢kindall指出这一点)。

0
# define modulus f 
def mod(a,b): 
    return b % a 

print mod(5,2) 

别名:

modulus=mod 
print modulus(5,2) 

这是相当Python的结构,它是数学家

进口不同的方式非常直观的服务,帮助您将功能分成不同的“名字空间”以便稍后在您的程序中使用,有时您希望使用很多功能,以便选择较短的变体。

你也可以这样做:

myat=math.atanh 

使别名在另一个 “名字空间”

,并用它作为:

myat(x) 

,因为它会使用math.atanh(x) - 变写得较短

典型的程序员方法将被定义所有你想使用,然后使用它。我所相信的是,当你需要一个函数时,它会“懒惰”=>导入模块。这就是为什么你想知道函数是否“可调用”的原因。

Python不是函数式编程语言(例如haskel),因此您可以加载或引用“按需”。

希望这有助于。

+1

实际上,可以在python中懒洋洋地加载东西。这是OP询问的问题,这远不清楚。 – Marcin

+0

如果你想解释“懒惰”的技巧,我相信这对他有帮助。我用python不太好。 – ljgww

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 

它们都指向同一个代码对象,它只是在范围字典中以不同名称存储。