Это мой первый вопрос здесь, после долгого консультирования. Я много разбираюсь в этой проблеме, и, думаю, я не нашел полезной информации, рассматривающей ее.functools.wraps возвращает __dict__ типа dict вместо типа mappingproxy
Я пытаюсь создать декоративный декодер python для моего кода в Python 3. Цель состоит в том, чтобы правильно обернуть функцию или класс, выполнив две вещи: напечатать предупреждение об отказе и добавить __doc__
с информацией об устаревании (которая его можно обработать также sphinx
). Я думаю, что я разобрал большую часть того, что хотел, я все еще боюсь с 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 Я ожидаю, что он замаскирует мою функцию обертывания, так что появляется, если это оригинальный класс, за исключением моих изменений. Конкретно, я хотел, чтобы функции, подобные 'help()', работали правильно в моем устаревшем классе. – j3mdamas