【问题标题】:"with" statement in python, why must the "as" section be a single objectpython中的“with”语句,为什么“as”部分必须是单个对象
【发布时间】:2013-12-14 21:57:38
【问题描述】:

使用 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/ 表明这只是合成糖

【问题讨论】:

    标签: python with-statement contextmanager


    【解决方案1】:

    不能在语法中使用不带括号的元组目标,否则你无法区分多个上下文管理器

    with contextmanager1 as target1, contextmanager2 as target2:
    

    看到逗号了吗?因为语法允许指定多个上下文管理器,所以编译器无法区分该表单和仅用逗号指定的多个目标。

    啊,你说,但是那里有一个as target2 部分,不能用来区分形式吗?然后记住,目标是可选的。以下也是完全合法的语法:

    with contextmanager1 as target1, contextmanager2:
    

    Python 知道逗号后面的部分是那里的另一个上下文管理器,因为它不允许不带括号的多个目标,消除所有歧义。

    在 Python 2.7 和 3.1 中实现了 PEP 343 之后,引入了对多个上下文管理器的支持。然而,PEP确实预料到了这种可能性:

    这个限制使得未来的语法扩展成为可能,拥有多个以逗号分隔的资源,每个资源都有自己的可选 as 子句。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2012-12-14
      • 2011-02-13
      • 1970-01-01
      • 2014-05-26
      • 2012-08-06
      • 1970-01-01
      • 2010-11-05
      • 2011-04-18
      相关资源
      最近更新 更多