python - 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
解决方案
您需要将该表达式包装在()
:
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
,这在该上下文中是允许的。或者至少这是我的猜测。我对阅读语法规范不是很有经验。
推荐阅读
- api - NGINX / Gunicorn / Flask - 上传适量数据时出现“502 Bad Gateway”和“sendfail() failed (32: Broken pipe)”
- html - 不应用边界半径。我尝试在 tr 标签上应用边框半径,但它不起作用
- django - 从对象获取 ManyToMany 字段时出错
- unity3d - 将统一 OnRenderImage() 转换为 URP
- mysql - laravel nova:索引上的 BelongsTo 字段值
- angular - 调试器;调试时在 chrome devtools 源中跳过语句
- html - 未应用背景颜色
- python - 在 libreoffice 中安装的 python 中管理和导入库
- c - 存储二维数组的奇怪行为?
- shell - CGI shell 脚本中的头文件(或包含文件)