渡される引数の数はわかっていますが、実際に呼び出される関数はわかっていません。この例を参照してください。
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
、aTypeError
が発生します。この名前foo
は、以前は-として知られていた元の関数ではなく、上記で定義した関数を参照するようになりました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
が引数をとらないことが非常に明白に見えるこのような状況でも、Pythonfoo
は、そのソース行を実行するときに呼び出されているのが実際に関数であることを知ることしかできません。
これはPythonのプロパティであり、強力ですが、速度が低下する原因にもなります。実際、パフォーマンスを向上させるためにモジュールを読み取り専用にすることは、しばらく前にpython-ideasメーリングリストで議論されましたが、実際のサポートは得られませんでした。