AlexMartelli 와 Catskul의 답변에 대한 후속 조치를 취하기 위해 reload
적어도 Python 2에서는 혼란스러워 보이는 매우 간단하지만 불쾌한 사례가 있습니다.
다음 소스 트리가 있다고 가정합니다.
- foo
- __init__.py
- bar.py
다음 내용으로 :
init.py :
from bar import Bar, Quux
bar.py :
print "Loading bar"
class Bar(object):
@property
def x(self):
return 42
class Quux(Bar):
object_count = 0
def __init__(self):
self.count = self.object_count
self.__class__.object_count += 1
@property
def x(self):
return super(Quux,self).x + 1
def __repr__(self):
return 'Quux[%d, x=%d]' % (self.count, self.x)
다음을 사용하지 않고도 잘 작동합니다 reload
.
>>> from foo import Quux
Loading bar
>>> Quux()
Quux[0, x=43]
>>> Quux()
Quux[1, x=43]
>>> Quux()
Quux[2, x=43]
그러나 재 장전을 시도하면 효과가 없거나 손상됩니다.
>>> import foo
Loading bar
>>> from foo import Quux
>>> Quux()
Quux[0, x=43]
>>> Quux()
Quux[1, x=43]
>>> reload(foo)
<module 'foo' from 'foo\__init__.pyc'>
>>> Quux()
Quux[2, x=43]
>>> from foo import Quux
>>> Quux()
Quux[3, x=43]
>>> reload(foo.bar)
Loading bar
<module 'foo.bar' from 'foo\bar.pyc'>
>>> Quux()
Traceback (most recent call last):
File "<stdin>", line 1, in <module>
File "foo\bar.py", line 17, in __repr__
return 'Quux[%d, x=%d]' % (self.count, self.x)
File "foo\bar.py", line 15, in x
return super(Quux,self).x + 1
TypeError: super(type, obj): obj must be an instance or subtype of type
>>> Quux().count
5
>>> Quux().count
6
>>> Quux = foo.bar.Quux
>>> Quux()
Quux[0, x=43]
>>> foo.Quux()
Traceback (most recent call last):
File "<stdin>", line 1, in <module>
File "foo\bar.py", line 17, in __repr__
return 'Quux[%d, x=%d]' % (self.count, self.x)
File "foo\bar.py", line 15, in x
return super(Quux,self).x + 1
TypeError: super(type, obj): obj must be an instance or subtype of type
>>> foo.Quux().count
8
bar
하위 모듈이 다시로드 되었는지 확인할 수있는 유일한 방법 은 다음과 같습니다 reload(foo.bar)
. 다시로드 된 Quux
클래스에 액세스하는 유일한 방법 은 다시로드 된 하위 모듈에 접근하여 가져 오는 것입니다. 하지만, foo
모듈 자체는 원래 붙잡고 유지 Quux
가 아마 사용하기 때문에, 클래스 오브젝트 from bar import Bar, Quux
(보다는 import bar
하였다 Quux = bar.Quux
); 더군다나 Quux
학급은 그 자체로 동기화되지 않았는데, 이는 기괴합니다.
... possible ... import a component Y from module X
"vs "question is ... importing a class or function X from a module Y
". 그 효과에 편집을 추가하고 있습니다.