6

Python では次のように言えます。

a,b,c=something_that_returns_a_3_tuple()

しかし、次のwithようなステートメント:

class thing(object):
    def __enter__(self):
        return (1,2,3)

    def __exit__(self,a,b,c):
        pass

with thing() as a,b,c:
    print a
    print b 
    print c

動作しません

次のものが必要です。

class thing(object):
    def __enter__(self):
        return (1,2,3)

    def __exit__(self,a,b,c):
        pass

with thing() as (a,b,c):
    print a
    print b 
    print c

最初の形式を許可することに関する実際的な問題はわかりません。これは、実装または論理を意味し、パーサーはコンマに問題があるべきではなく (あいまいではありません)、論理的な理由がわかりません。

http://docs.python.org/release/2.5/whatsnew/pep-343.html

http://www.python.org/dev/peps/pep-0343/は、これが単なる構文糖であることを示唆しています

4

1 に答える 1

27

構文で括弧なしでタプル ターゲットを使用することはできません。そうしないと、複数のコンテキスト マネージャーを区別できないためです。

with contextmanager1 as target1, contextmanager2 as target2:

そこにコンマが見えますか?文法では複数のコンテキスト マネージャーを指定できるため、コンパイラーはその形式とコンマだけで指定された複数のターゲットを区別できません。

あ、でもそこにあるas target2部分があって、それで形を区別できないの?次に、ターゲットがオプションであることを思い出してください。以下も完全に正当な構文です。

with contextmanager1 as target1, contextmanager2:

Python は、コンマの後の部分が別のコンテキスト マネージャーであることを認識しています。これは、括弧なしで複数のターゲットを許可せず、あいまいさをすべて排除しているためです。

複数のコンテキスト マネージャーのサポートは、Python 2.7 および 3.1 で PEP 343 が実装された後に導入されました。ただし、PEP次の可能性を予測していました。

この制限により、構文を将来的に拡張して、それぞれに独自のオプションの as-clause を持つ複数のコンマ区切りのリソースを含めることができます。

于 2013-12-14T22:01:02.330 に答える