3

recursive_reprPython 3.2 では、モジュールに新しい関数が導入されてい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

私が理解できなかったのは、 Bootstrapの問題とは何か、そしてなぜ@wraps(user_function)適用できないのwrapperですか?

4

2 に答える 2

2

「ブートストラップの問題」は循環依存関係にあるように見えます。この場合、 をfunctoolsインポートしcollections、それがさらに をインポートしreprlibます。reprlibをインポートしようとするとfunctools.wraps、暗黙のうちにそれ自体をインポートしようとしますが、これは機能しません。Python プログラミング FAQ (2.7、しかしこれはそれ以降変更されていないと思います) は、モジュールがfrom module import functionフォームを使用する場合、これらのモジュールが行う循環インポートが失敗すると述べています。

于 2012-07-31T19:33:12.600 に答える
1

「ブートストラップ」とは、「自分のブートストラップで自分自身を拾う」というフレーズを指しますが、これは明らかに不可能です。このコンテキストでは、この関数自体が wraps() の定義の一部であるため、ここで wraps() を使用できないことを意味します。

于 2012-07-31T19:30:27.473 に答える