1. ホーム
  2. python

[解決済み] AttributeErrorを受信しています。WITH オブジェクトに EXIT が定義されていても __exit__ を受け取る

2022-02-09 23:53:12

質問

というエラーが表示されます。 AttributeError: __exit__ を終了した後、以下のコードで with セクションを作成します。Elementオブジェクトが返されるのは with を持ち、それが __exit__ が定義されているので、困惑しています。

class Builder:
    def __init__(self):
        print("Builder init fires")

    def __getattr__(self, name):
        return Element(name, self)

class Element:
    def __init__(self, name, builder):
        self.name = name
        self.builder = builder
        print("Element init fires for name of", self.name)
    def __call__(*args, **kargs):
        print("CALL fires, now with attributes listed:")
        for attr, value in sorted(kargs.items()):
            print(' %s=>%s' % (attr, value))

    def __enter__(self):  
        return self

    def __exit__(self, type, value, traceback): 
        pass

aa = Builder()        
with aa.feed(xmlns='http://www.w3.org/2005/Atom'):
    print("INSIDE THE WITH")

解決方法は?

の後の式の値は with キーワードは有効なコンテキスト・マネージャでなければなりません。つまり の属性が必要です。 __enter__ __exit__ で、これらはdocsに記述されているパラメータを受け入れる必要があります。 ステートメントコンテキストマネージャー付き . の部分を簡単に確認することができます。 aa.feed は許容範囲内ですが、式全体の値は None で、必要な属性がない。Python 3.5と3.6では __exit__ がない場合、後者は __enter__ . 予期せぬことはありません。

また、忘れているのは self の行に def __call__(self, *args, **kargs): というのは、もしargsを使うのであれば問題ですし、argsを使わないのもpythonicなパターンです。