나는 walkerround를 시도하고있는 reload()
(파이썬 2 내장과 importlib
모두)이라는 성가신 행동을 발견했다.어떻게 super()를 우아하고 안전하게 사용할 수 있습니까 (파이썬 모듈 재로드에 관한)?
대화 형 Python 인터프리터에서 데이터를 분석하고 있습니다. 내 코드는 자주 변경되는 모듈 (Python 2 및 3 호환)로 구성되어 있습니다.
데이터로드 시간이 길어 인터프리터를 다시 시작할 수 없으므로 모듈을 재귀 적으로 다시로드하는 것이 좋습니다.
문제는 reload()
updates the code but preserves the module global scope입니다 (Python 3 importlib.reload()
에도 적용됨). super()
을 사용하는 방법에 해로울 것 같습니다 (무슨 일이 벌어지고 있는지 깨닫는 데 시간이 걸렸습니다).
모듈 bar.py위한 최소한의 실패 예 :
class Bar(object):
def __init__(self):
super(Bar, self).__init__()
이다 :
>>> import bar
>>> class Foo(bar.Bar):
... pass
...
>>> reload(bar)
<module 'bar' from '[censored]/bar.py'>
>>> Foo()
Traceback (most recent call last):
File "<stdin>", line 1, in <module>
File "[censored]/bar.py", line 3, in __init__
super(Bar, self).__init__()
TypeError: super(type, obj): obj must be an instance or subtype of type
I 수
파이썬 2와 호환되지 이다- use
super()
without arguments in Python 3 manner (), - 포기하면 대신
Bar.__init__(self)
(which is harder to maintain 및 discouraged)을 호출하십시오. - monkey-patch 클래스 자체에 대한 참조를 순환하는 참조를 포함하는 클래스 속성을 추가하는 클래스입니다.
내가 좋아하는 아이디어는 없습니다. 이 문제를 다루는 다른 방법이 있습니까?
'__init__' 메소드가 아닌 클래스 레벨에'super (Bar, self) .__ init __()'을 넣었으므로'bar.py'는 이미 실패합니다. – user2357112
'super '의 사용법은 실제로 유효하지 않습니다. 'super'는 클래스 바디가 아닌 클래스의 메소드 내에서 사용됩니다. – direprobs
또한, 모듈을 새로 고침하는 것은 일반적으로 힘들어하기가 정말 쉽지 않으며,'reload'는 가장 간단한 경우 만 처리합니다. 가장 좋은 방법은 항상 파이썬을 처음부터 다시 시작하는 것입니다. – user2357112