2016-07-09 9 views
0

__enter__メソッドの戻り値は常にselfでなければなりません。`__enter__`メソッドの戻り値は、常にPythonで` self`にする必要があります

Python documentationは言う:

object.__enter__(self) この オブジェクトに関連するランタイム・コンテキストを入力します。 withステートメントは、このメソッドの戻り値を、ステートメントのas句に指定されている ターゲットにバインドします(存在する場合)。これにより

1は、文脈上他のクラスのメソッドを呼び出すことができないだろうそれなしとして、実用的な何かをする、selfクラスの__enter__メソッドから常に返されshould't。

たとえば、次のコードでは、s.main()は正常に動作しますが、b1.main()エラーは出力されます。それはコンテキストマネージャとしてインスタンスの属性を使用することは理にかなっている場合

class a(object): 
    def __init__(self): 
     pass 

    def __enter__(self): 
     return self 

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

    def main(self): 
     print " in a::main self %d " , id(self) 


class b(object): 
    def __init__(self): 
     pass 

    def __enter__(self): 
     return "something else" 

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

    def main(self): 
     print "in b::main !! self id " , id(self) 

with a() as s: 
    s.main() 

with b() as b1: 
    b1.main() 

s = a() 
s.main() 
+0

を質問あなたは何かを返すことが実用的になる場合を想像することができます」に沸きます'__enter__'からの' self'以外のものです。そして、まあ、それはあなたの幻想にかかっています。 –

+0

必ずしもそうではありません。 https://github.com/zzzeek/sqlalchemy/blob/4856493efc1f6b7fdecf36e020a95636f600a626/lib/sqlalchemy/engine/base.py#L1925 – DeepSpace

答えて

0

ない:

class A: 
    def __init__(self, useful_obj): 
     self.useful_obj = useful_obj 

    def __enter__(self): 
     return self.useful_obj 

    def __exit__(self): 
     pass 

with A(some_obj) as a: 
    # magic done implicitly by a.useful_obj 
    . 
    . 
    . 

この状況はSQLAlchemyののcodeで見ることができます。

あなたは、たとえば、strのいずれかの方法を使用する場合は、提供されたコードサンプルは動作します:

​​3210
関連する問題