오랜 시간 컨설팅을 한 후 여기가 저의 첫 번째 질문입니다. 나는이 문제에 대해 많은 것을 봤는데 나는 그것을 다루는 유용한 정보를 찾지 못했다고 생각한다.functools.wraps가 mappingproxy 유형이 아닌 dict 유형의 __dict__을 반환했습니다.
Python 3에서 내 코드에 대한 일반적인 deprecation python 데코레이터를 만들려고합니다. 목적은 두 가지 일을하는 함수 또는 클래스를 올바르게 래핑하는 것입니다 : deprecation에 대한 경고를 인쇄하고 __doc__
앞에 비추천 정보 sphinx
으로도 처리 할 수 있습니다). 나는 내가 원하는 것을 대부분 다 써 버렸다고 생각한다. 스핑크스와 여전히 고심하고 있지만, functools.wraps
의 행동에 대해 궁금한 점이있다. 기본적으로 래핑 된 클래스의 __dict__
은 dict
이고 래핑되지 않은 클래스는 mappingproxy
유형입니다.
import functools
class Deprecated(object):
def __call__(self, cls):
myassigns = functools.WRAPPER_ASSIGNMENTS
myassigns += ('__mro__',)
@functools.wraps(cls, assigned=myassigns)
def new_func(*args, **kwargs):
warnings.warn(message, category=DeprecationWarning, stacklevel=2)
return cls(*args, **kwargs)
return new_func
@Deprecated()
class SomeOldClass:
def some_method(self, x, y):
return x + y
class SomeClass:
def some_method(self, x, y):
return x + y
print(type(SomeOldClass.__dict__))
print(type(SomeClass.__dict__))
그리고 출력 :
<class 'dict'>
<class 'mappingproxy'>
functools.wraps
오작동이 아니면 내가 뭔가 잘못하고있는 중이 야 여기
"랩된 클래스"는 함수입니다. 'functools.wraps'는 무엇을 기대 했습니까? – user2357112
'some_method'을 감쌀려고 했습니까? 왜냐하면, 당신은 클래스 자체를 감쌌다. 어떤 종류의 작품 (깊이 보이지는 않았지만 인스턴스를 생성 할 때 경고해야한다고 생각한다.) 또한 이름이 클래스가 아니라 래퍼 함수를 참조한다는 것을 의미한다. 더 이상 클래스에 관련된 것들은'SomeOldClass'에 명시 적으로'__wrapped__' 속성으로 드릴 스루하지 않고 볼 수 있습니다. 클래스를 이런 식으로 사용하지 않으려면 래퍼가 클래스로 들어가 클래스를 래핑하는 함수를 반환하지 않고 명시 적으로'__init__' 또는'__new__'을 명시 적으로 래핑 (원래'cls'를 반환)해야합니다. – ShadowRanger
@ user2357112 필자는 필자의 래핑 (wrapping) 기능을 감추기를 기대하며, 필자의 변경 사항을 제외하고는 그것이 원래의 클래스 인 것처럼 보인다. 구체적으로, 나는'help()'와 같은 함수가 내 비추천 클래스에서 제대로 작동하기를 원했다. – j3mdamas