0
__enter__
メソッドの戻り値は常にself
でなければなりません。`__enter__`メソッドの戻り値は、常にPythonで` self`にする必要があります
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()
を質問あなたは何かを返すことが実用的になる場合を想像することができます」に沸きます'__enter__'からの' self'以外のものです。そして、まあ、それはあなたの幻想にかかっています。 –
必ずしもそうではありません。 https://github.com/zzzeek/sqlalchemy/blob/4856493efc1f6b7fdecf36e020a95636f600a626/lib/sqlalchemy/engine/base.py#L1925 – DeepSpace