2

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

我最初的问题是在函数中检查模块函数是否可调用。我环顾四周,决定使用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)不会抱怨, . 我觉得这有点尴尬 - 有没有办法以编程方式避免这种阴影?modfrom sys import mod

4

3 回答 3

3

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

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

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

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

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

拥有它的实际调用别名真是太棒了。

完全不确定您的意思,但我认为您只是希望它始终是一个对象。它已经是。

mod 是数学函数,sys.mod 返回加载模块的列表,但 python (2.7) 不会抱怨 from 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

(感谢kindall指出这一点)。

于 2012-09-14T02:32:54.610 回答
1

假设我有一个包含以下内容的模块:

def foo(): pass
bar = foo

is通过使用or ,您可以很容易地看到它们是相同的功能id()

>>> import demo
>>> from demo import *
>>> demo.foo is foo
True
>>> id(demo.foo) == id(foo)
True
>>> demo.bar is foo
True

它们都引用同一个代码对象,只是在作用域字典中以不同的名称存储。

于 2012-09-14T07:00:49.243 回答
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)- 写起来更短

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

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

希望这可以帮助。

于 2012-09-14T03:15:25.513 回答