为何带括号的context managers在Python3.9可用但3.8报语法错误?
问题解答
这个带括号的with语句写法是Python 3.9才正式支持的语法,原因和Python解析器的迭代有关:
- Python 3.8及更早版本使用LL(1)解析器,这种解析器的语法解析能力存在限制,无法识别括号包裹的多上下文管理器写法,加括号后会直接触发语法错误。
- Python 3.9版本正式替换为PEG解析器,PEG解析器没有LL(1)解析器的单Token前瞻限制,因此新增支持了用括号包裹多个上下文管理器的语法,你甚至可以在括号内换行拆分多个上下文项,不需要写行尾反斜杠,示例如下:
with ( Foo() as f, Foo() as b, ): print("Foo")
这个语法调整属于PEG解析器落地的配套优化,没有单独作为核心特性放在版本更新的高亮说明中,所以没找到对应说明是正常情况。
内容的提问来源于stack exchange,提问作者mogoh
相关产品推荐
相关产品推荐

