yield搭配海象运算符:=出现SyntaxError无效语法问题如何解决?
语法错误产生原因
- Python版本不支持海象运算符。
:=海象运算符是Python 3.8版本才新增的语法特性,运行环境的Python版本低于3.8时,所有使用:=的代码都会直接抛出SyntaxError。 - 运算符优先级导致解析失败。即使是Python 3.8及以上版本,yield表达式的优先级高于海象运算符,直接写
yield excel := Dispatch("Excel.Application")时,解析器会将代码识别为(yield excel) := Dispatch("Excel.Application"),而赋值语句的左值不能是yield表达式,因此触发语法错误。
解决方案
方案1:兼容海象运算符的修改(适用于Python 3.8及以上版本)
给海象赋值语句加上括号明确优先级即可,同时注意win32com封装的Excel退出方法为大写开头的Quit,小写写法会触发属性错误,修改后代码如下:
import contextlib from typing import Generator from win32com.client import Dispatch @contextlib.contextmanager def excel_ctx() -> Generator[Dispatch, None, None] : try: yield (excel := Dispatch("Excel.Application")) finally: excel.Quit()
方案2:全版本兼容的修改(适用于所有Python3版本)
放弃使用海象运算符,将变量赋值拆分到yield语句之前,同时增加空值判断避免实例创建失败时调用方法报错,写法兼容性最好,代码如下:
import contextlib from typing import Generator from win32com.client import Dispatch @contextlib.contextmanager def excel_ctx() -> Generator[Dispatch, None, None] : excel = None try: excel = Dispatch("Excel.Application") yield excel finally: if excel is not None: excel.Quit()
内容的提问来源于stack exchange,提问作者Greedo
相关产品推荐
相关产品推荐

