传递的参数数量是已知的,但实际调用的函数却未知。请参阅以下示例:
def foo():
print("I take no arguments.")
def bar():
print("I call foo")
foo()
这看起来似乎很明显,但是让我们将它们放入一个名为“ fubar.py”的文件中。现在,在交互式Python会话中,执行以下操作:
>>> import fubar
>>> fubar.foo()
I take no arguments.
>>> fubar.bar()
I call foo
I take no arguments.
那是显而易见的。现在是有趣的部分。我们将定义一个函数,该函数需要非零数量的参数:
>>> def notfoo(a):
... print("I take arguments!")
...
现在我们做的事情叫做猴子修补。我们其实是可以更换的功能foo
中fubar
模块:
>>> fubar.foo = notfoo
现在,当我们调用时bar
,TypeError
将引发a;foo
现在,该名称指的是我们上面定义的功能,而不是原来的功能(以前称为as-)foo
。
>>> fubar.bar()
I call foo
Traceback (most recent call last):
File "<stdin>", line 1, in <module>
File "/home/horazont/tmp/fubar.py", line 6, in bar
foo()
TypeError: notfoo() missing 1 required positional argument: 'a'
因此,即使在这种情况下,似乎很明显的是,被调用函数foo
没有参数,Python也只能知道它实际上foo
是在执行该源代码行时被调用的函数。
这是Python的一个特性,使其功能强大,但同时也导致其运行缓慢。实际上,一段时间前在python-ideas邮件列表中已经讨论了将模块设置为只读以提高性能,但是并没有获得任何真正的支持。