생성기 함수에서 반환 된 생성기 개체가 함수 개체에 대한 참조를 보유하고 있습니까? 즉, 가능한이를 수 magic_fn
을 구현하는 것이다발전기는 발전기 기능을 알고 있습니까?
>>> def gen():
... yield 1
... yield 2
...
>>> gen.attr = 'potato'
>>> g = gen()
>>> del gen
>>> next(g)
1
>>> magic_fn(g, 'attr')
'potato'
발생기는 코드 개체 (g.gi_code
), 프레임 (g.gi_frame
), 및 이름 (g.__name__
)에 대한 참조를 갖는다. 코드 객체는 심지어 gen.__code__
과 같은 메모리 주소를가집니다.
그러나 이미 가비지 수집되지 않았다고 가정하면 gen.__dict__
에 액세스 할 수있는 방법을 찾을 수 없습니다. 가능합니까? 아니면 생성기가 생성되는 즉시 링크가 손실 되었습니까?
감사 :
마찬가지로, 발전기 반복자가 함수의
__dict__
, 또는 기타 참조 체인이 함수의__dict__
에 저장된 항목을 검색 할 것이라고에 대한 참조를 유지하지 않음을 표시 할 수 있습니다 , 나는 또한 작별 인사를 인쇄하는'Dummy'에'__del__'을 구현하여 수집 된 것을 볼 수있었습니다. 'weakref.ref'의 사용법과 작동 원리에 대해 더 설명해 주시겠습니까? – wim@wim : 약한 참조에 대한 약간의 설명을 추가했습니다. – user2357112