簡體   English   中英

Python元組在return語句中解壓縮

[英]Python tuple unpacking in return statement

Python語言(尤其是3.x)允許對迭代的非常一般的解包 ,其中一個簡單的例子就是

a, *rest = 1, 2, 3

多年來,這種拆包已經逐漸推廣(參見例如PEP 3132PEP 448 ),允許它在越來越多的情況下使用。 因此,我驚訝地發現以下是Python 3.6中的無效語法(在Python 3.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.2 提交的評論。

該提交使賦值表達式能夠進行testlist_star_expr生成(允許無表達式解包),但是讓return語句生成了testlist 我懷疑提交錯過了這個(可能還有其他地方,但我現在關注的是return_stmt生產)。

我繼續修改了Python Grammar / Grammar文件以允許這個。 所有測試都繼續通過,包括test_grammar.py文件中的test_grammar.py (但這似乎並非詳盡無遺)。

如果你很好奇, 這就是我所做的改變 隨意克隆或下載我的分叉

更新:我已經提交了一個bpo問題和一個關於return(和yield)解包的pull請求

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM