전달되는 인수의 수는 알려져 있지만 실제로 호출되는 함수는 알려져 있지 않습니다. 이 예를 참조하십시오.
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.
그것은 분명했습니다. 이제 재미있는 부분입니다. 0이 아닌 양의 인수가 필요한 함수를 정의합니다.
>>> def notfoo(a):
... print("I take arguments!")
...
이제 우리는 원숭이 패치 라고하는 것을 합니다. 실제로 모듈 에서 함수 를 대체 할 수 있습니다 .foofubar
>>> fubar.foo = notfoo
이제 우리가를 호출 할 때 bar, a TypeError가 발생합니다. 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가 인수를 취하지 않는다는 것이 매우 명백해 보일 수 있지만 , Python foo은 해당 소스 행을 실행할 때 실제로 호출되는 함수 임을 알 수만 있습니다 .
이것은 Python의 속성으로 강력하게 만들지 만 속도가 느려집니다. 사실, 성능 향상을 위해 모듈을 읽기 전용으로 만드는 것은 얼마 전에 python-ideas 메일 링리스트 에서 논의 되었지만 실제 지원을 얻지 못했습니다.