ホームページ > バックエンド開発 > Python チュートリアル > Python の記述子とデコレータ (プロパティ) によって引き起こされる無限再帰問題を共有する

Python の記述子とデコレータ (プロパティ) によって引き起こされる無限再帰問題を共有する

WBOYWBOYWBOYWBOYWBOYWBOYWBOYWBOYWBOYWBOYWBOYWBOYWB
リリース: 2016-06-16 08:43:24
オリジナル
1114 人が閲覧しました

私が遭遇した小さな問題を共有します。次のような Python コードがあります。

コードをコピー コードは次のとおりです:

# コーディング: utf-8

クラス A(オブジェクト):

@プロパティ
def _value(self):
# AttributeError("test")
を発生させる return {"v": "これはテストです。"}

def __getattr__(self, key):
print "__getattr__:", key
return self._value[key]

if __name__ == '__main__':
a = A()
印刷版



を実行すると、正しい結果が得られます。
コードをコピー コードは次のとおりです:

__getattr__:v
これはテストです。
ただし、
を入れる場合は注意してください。
コードをコピー コードは次のとおりです:

# AttributeError("test")を発生させる


この行のコメントが削除されると、つまり _value メソッドで AttributeError 例外がスローされると、状況は少しおかしくなります。プログラムは実行時に例外をスローしませんが、無限再帰に入ります:

コードをコピー コードは次のとおりです:

ファイル「attr_test.py」、__getattr__
の 12 行目 self._value[key]
を返します ファイル「attr_test.py」、__getattr__
の 12 行目 self._value[key]
を返します RuntimeError: Python オブジェクトの呼び出し中に再帰の最大深さを超えました

複数の関係者を調査した結果、プロパティ デコレーターに問題があることが判明しました。プロパティは実際には記述子です。このようなテキストは Python ドキュメントにあります:

コードをコピー コードは次のとおりです:

object.__get__(self, インスタンス, owner)

所有者クラス (クラス属性アクセス) またはそのクラスのインスタンスの属性 (インスタンス属性アクセス) を取得するために呼び出されます。所有者は常に所有者クラスですが、インスタンスは属性にアクセスしたインスタンスです。または、属性が所有者を通じてアクセスされる場合、このメソッドは (計算された) 属性値を返すか、AttributeError 例外を発生させる必要があります。

このように、ユーザーが ._value にアクセスすると、AttributeError がスローされ、__getattr__ メソッドが呼び出されて取得が試みられます。このようにして、プログラムは無限再帰になります。

この問題は複雑ではないようですが、_value メソッドが比較的微妙な方法で AttributeError をスローする場合、デバッグがより困難になります。

関連ラベル:
ソース:php.cn
このウェブサイトの声明
この記事の内容はネチズンが自主的に寄稿したものであり、著作権は原著者に帰属します。このサイトは、それに相当する法的責任を負いません。盗作または侵害の疑いのあるコンテンツを見つけた場合は、admin@php.cn までご連絡ください。
最新の問題
人気のチュートリアル
詳細>
最新のダウンロード
詳細>
ウェブエフェクト
公式サイト
サイト素材
フロントエンドテンプレート