为什么在Python3.8之前,返回语句中的星号可迭代解压缩是不带括号的无效语法?

2024-08-10Python开发问题
2

本文介绍了为什么在Python3.8之前,返回语句中的星号可迭代解压缩是不带括号的无效语法?的处理方法,对大家解决问题具有一定的参考价值,需要的朋友们下面随着跟版网的小编来一起学习吧!

问题描述

Python语言(特别是3.x)允许对迭代文件进行非常通用的解包

就是一个简单的例子
a, *rest = 1, 2, 3
这些年来,这种拆包已经逐渐推广(例如,参见<[3-0]和PEP 448),允许它在越来越多的情况下使用。因此,我惊讶地发现以下语法在Python3.6中是无效的(在Python3.7中仍然是如此):

def f():
    rest = [2, 3]
    return 1, *rest  # Invalid

我可以将返回的元组封装在括号中,如下所示:

def f():
    rest = [2, 3]
    return (1, *rest)  # Valid

我在return语句中使用这一点似乎很重要,因为

t = 1, *rest

确实是合法的,结果是带括号和不带括号的结果相同。

Python开发人员只是忘记了大小写,还是有什么原因导致大小写是无效语法?

我为什么关心

这破坏了我认为我与Python语言之间的一个重要约定。请考虑以下(也是有效的)解决方案:

def f():
    rest = [2, 3]
    t = 1, *rest
    return t
通常情况下,当我有这样的代码时,我认为t是一个临时名称,我应该可以简单地用它的定义替换底线中的t就可以去掉它。但在这种情况下,这会导致无效代码

def f():
    rest = [2, 3]
    return 1, *rest

当然,必须在返回值两边放上括号没什么大不了的,但通常只需要额外的括号来区分几个可能的结果(分组)。这里并非如此,因为省略括号不会产生其他一些不需要的行为,而是根本不会产生任何行为。

更新

从Python 3.8开始(请参阅this list上的第7项),上面讨论的通用语法现在有效。

推荐答案

根据this commit对Python3.2的评论,我怀疑这是意外。

提交使赋值表达式能够接受testlist_star_expr结果(允许不带括号的解包),但使返回语句获得testlist结果。我怀疑提交刚刚错过了这个位置(可能还有其他位置,但我现在主要关注return_stmt生产)。

我继续修改了Python语法/语法文件以允许这样做。所有测试继续通过,包括test_grammar.py文件中的测试(但这似乎不是非常详尽)。

如果您感兴趣,请访问this is the change I made。欢迎克隆或下载my fork。

更新:我已提交bpo issue和pull request退货(和收益率)解包。

这篇关于为什么在Python3.8之前,返回语句中的星号可迭代解压缩是不带括号的无效语法?的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持跟版网!

The End

相关推荐

在xarray中按单个维度的多个坐标分组
groupby multiple coords along a single dimension in xarray(在xarray中按单个维度的多个坐标分组)...
2024-08-22 Python开发问题
15

Pandas中的GROUP BY AND SUM不丢失列
Group by and Sum in Pandas without losing columns(Pandas中的GROUP BY AND SUM不丢失列)...
2024-08-22 Python开发问题
17

GROUP BY+新列+基于条件的前一行抓取值
Group by + New Column + Grab value former row based on conditionals(GROUP BY+新列+基于条件的前一行抓取值)...
2024-08-22 Python开发问题
18

PANDA中的Groupby算法和插值算法
Groupby and interpolate in Pandas(PANDA中的Groupby算法和插值算法)...
2024-08-22 Python开发问题
11

PANAS-基于列对行进行分组,并将NaN替换为非空值
Pandas - Group Rows based on a column and replace NaN with non-null values(PANAS-基于列对行进行分组,并将NaN替换为非空值)...
2024-08-22 Python开发问题
10

按10分钟间隔对 pandas 数据帧进行分组
Grouping pandas DataFrame by 10 minute intervals(按10分钟间隔对 pandas 数据帧进行分组)...
2024-08-22 Python开发问题
11