Что такое "проблемы с загрузкой" декоратора functools wraps?
Python 3.2 представляет новую функцию recursive_repr
в reprlib
модуль.
Когда я посмотрел в исходный код, я нашел этот код:
def recursive_repr(fillvalue='...'):
'Decorator to make a repr function return fillvalue for a recursive call'
def decorating_function(user_function):
repr_running = set()
def wrapper(self):
key = id(self), get_ident()
if key in repr_running:
return fillvalue
repr_running.add(key)
try:
result = user_function(self)
finally:
repr_running.discard(key)
return result
# Can't use functools.wraps() here because of bootstrap issues
wrapper.__module__ = getattr(user_function, '__module__')
wrapper.__doc__ = getattr(user_function, '__doc__')
wrapper.__name__ = getattr(user_function, '__name__')
wrapper.__annotations__ = getattr(user_function, '__annotations__', {})
return wrapper
return decorating_function
То, что я не понял, это то, что проблемы с загрузкой и почему не может @wraps(user_function)
применяться к wrapper
?
2 ответа
Мне кажется, что "проблемы с загрузкой" происходят из круговой зависимости. В этом случае, functools
импорт collections
который в свою очередь импортирует reprlib
, Если reprlib
пытался импортировать functools.wraps
, он будет неявно пытаться импортировать себя, который не будет работать. В FAQ по программированию на Python (2.7, но я не думаю, что это изменилось с тех пор) говорится, что циклический импорт завершится неудачно, когда модули используют from module import function
форма, которую делают эти модули.
"Начальная загрузка" относится к фразе "взять себя в руки своими собственными начальными загрузками", что явно невозможно. В этом контексте это означает, что вы не можете использовать wraps() здесь, потому что эта функция сама является частью определения wraps().