AttributeError: 'functools.partial' object has no attribute '__code__'
для решения этой ошибки мы можем использовать
обертывания
functools.WRAPPER_ASSIGNMENTS
для обновления атрибутов,
по умолчанию (' module ', ' name ', ' doc ')
в питоне 2.7.6
или
мы можем обновить только существующие атрибуты ...
import functools
import itertools
def wraps_safely(obj, attr_names=functools.WRAPPER_ASSIGNMENTS):
return wraps(obj, assigned=itertools.ifilter(functools.partial(hasattr, obj), attr_names))
`>>> def foo():
`... ` ` """ Ubiquitous foo function ...."""`
...
>>> functools.wraps(partial(foo))(foo)()
`Traceback (most recent call last):
File "<stdin>", line 1, in <module>
File ```"/System/Library/Frameworks/Python.framework/Versions/2.7/lib/python2.7/functools.py", ``line 33, in update_wrapper`
setattr(wrapper, attr, getattr(wrapped, attr))
AttributeError: 'functools.partial' object has no attribute '__module__'
>>> wraps_safely(partial(foo))(foo)()
>>> `
`
просто отфильтруйте все те атрибуты, которых нет.
второй подход будет: -
* строго иметь дело только с частичными объектами.
сворачивает обертки с помощью singledispatch
, и он создает обернутый частичный объект, а его атрибут будет взят из атрибута функции "fun".
импортные фунтоолы
def wraps_partial(wrapper, *args, **kwargs):
` """ Creates a callable object whose attributes will be set from the partials nested func attribute ..."""
` ` ` wrapper = wrapper.func``
while isinstance(wrapper, functools.partial):
wrapper = wrapper.func
return functools.wraps(wrapper, *args, **kwargs)
# after returning functools.wraps
def foo():
""" Foo function.
:return: None """
pass
>>> wraps_partial(partial(partial(foo)))(lambda : None).__doc__
' Foo Function, returns None '
>>> wraps_partial(partial(partial(foo)))(lambda : None).__name__
'foo'
>>> wraps_partial(partial(partial(foo)))(lambda : None)()
>>> pfoo = partial(partial(foo))
>>> @wraps_partial(pfoo)
... def not_foo():
...
""" Not Foo function ... """
...
>>> not_foo.__doc__
' Foo Function, returns None '
>>> not_foo.__name__
'foo'
>>>
теперь мы можем получить оригинальную документацию по функциям.
Python (CPython) 3.
из импортных оболочек functools, частичное, WRAPPER_ASSIGNMENTS
попробовать:
wraps(partial(wraps))(wraps)
except AttributeError:
@wraps(wraps)
def wraps(obj, attr_names=WRAPPER_ASSIGNMENTS, wraps=wraps):
return wraps(obj, assigned=(name for name in attr_names if hasattr(obj, name)))
* мы определяем новую функцию обтеканий, только если нам не удается обернуть частичное, *
* используйте оригинальную упаковку для копирования документов *
также
В (Python 3.5) у нас есть ссылка на исходную функцию, и она поддерживается в частичном. Вы можете получить к нему доступ как .func:
из functools
частичный импорт
def a(b):
print(b)
In[20]: c=partial(a,5)
In[21]: c.func.__module__
Out[21]: '__main__'
In[22]: c.func.__name__
Out[22]: 'a'