Что такое "проблемы с загрузкой" декоратора 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().

Другие вопросы по тегам