2

たとえば、私はこのコードを持っています:

with MyClass() as x:
    print 'I have only {0}'.format(x)
    with MyClass() as y:
        print 'I have {0} and {1}'.format(x, y)
    print 'Again only {0}'.format(x)

xy両方とも、対応するwithブロックの終了後に初期化を解除する必要があります。またx、 とyは のインスタンスではありませんMyClass

__exit__には 3 つの引数しかなく、各引数は None です (例外が指定されていない場合)。

どの__exit__ブロックで終了したか、どの値が返されたかをどのように判断でき__enter__ますか?

(NB コードはスレッドセーフである必要があります)。


例:

class MyClass(object):
    def __enter__(self):
        if moon_phase > 0:
            return 123
        else:
            return 456
    def __exit__(self):
        number = what_was_returned_by_enter()
        print 'End of block with', number


 with MyClass() as x:
    print x  # 123
    with MyClass() as y:
        print x, 'and', y  # 123 and 456
    # printed "End of block with 456"
    print x  # 123
 # printed "End of block with 123"
4

1 に答える 1