首页 > 解决方案 > Python 赋值表达式语法错误

问题描述

使用 Python 3.9,我有一个返回 a 的函数,tuple[float, float]如下所示:

return slope := _slope(c1, c2), _y_intercept(c1, slope)

我使用PEP 572中定义的赋值表达式。

但它给了我以下错误:

test_moderate.py:None (test_moderate.py)
../../venv/lib/python3.9/site-packages/_pytest/python.py:578: in _importtestmodule
    mod = import_path(self.fspath, mode=importmode)
../../venv/lib/python3.9/site-packages/_pytest/pathlib.py:524: in import_path
    importlib.import_module(module_name)
/Users/me/.pyenv/versions/3.9.2/lib/python3.9/importlib/__init__.py:127: in import_module
    return _bootstrap._gcd_import(name[level:], package, level)
<frozen importlib._bootstrap>:1030: in _gcd_import
    ???
<frozen importlib._bootstrap>:1007: in _find_and_load
    ???
<frozen importlib._bootstrap>:986: in _find_and_load_unlocked
    ???
<frozen importlib._bootstrap>:680: in _load_unlocked
    ???
../../venv/lib/python3.9/site-packages/_pytest/assertion/rewrite.py:170: in exec_module
    exec(co, module.__dict__)
test_moderate.py:4: in <module>
    from moderate import functions as func
E     File "/moderate/functions.py", line 346
E       return slope := _slope(c1, c2), _y_intercept(c1, slope)
E                    ^
E   SyntaxError: invalid syntax
collected 0 items / 1 error

标签: pythonpython-3.x

解决方案


您需要将该表达式包装在()

return (slope := _slope(c1, c2), _y_intercept(c1, slope))

我猜你的代码被解析为:

return slope (:= _slope(c1, c2), _y_intercept(c1, slope))

这没有任何意义。如有疑问,请在表达式周围加上括号,看看是否会改变行为。如果是这样,它可能是一个优先问题。


不过我承认,我不确定为什么有必要这样做。我希望return完全允许表达式在其执行之前对其进行评估。:=确实具有任何运算符的最低优先级,但我仍然希望它在return.

查看Python 语法,它可能与return定义为采用以下形式的事实有关:

return_stmt:
    | 'return' [star_expressions]

star_expressions:
    | star_expression (',' star_expression )+ [','] 
    | star_expression ',' 
    | star_expression

star_expression:
    | '*' bitwise_or 
    | expression

:=引入 a named_expression,而不是star_expressions

named_expression:
    | NAME ':=' ~ expression 
    | expression !':='

意思是不兼容。将命名表达式包装在括号中会将其转换为 a star_expressions,这在该上下文中是允许的。或者至少这是我的猜测。我对阅读语法规范不是很有经验。


推荐阅读