2014-10-08 127 views
7

有時函數會給出一個您只想丟棄的返回值,而不是發送到輸出流。處理這個問題的優雅方式是什麼?如何優雅地忽略Python函數的某些返回值?

請注意,我們正在討論的功能會返回一些您無法更改的功能。

def fn(): 
    return 5 

我個人曾經使用null,但我正在尋找一個更Python的方式:

null = fn() 
+0

「發送到輸出流」是什麼意思? – BrenBarn 2014-10-08 07:58:17

+0

僅在全局範圍內評估'fn()'會「打印」值5. – PascalVKooten 2014-10-08 07:58:44

+6

這隻在交互式解釋器中才是正確的。如果將文件作爲腳本運行,它不會發生,並且不會影響任何內容。我不認爲在交互式會話中抑制輸出的需要是一個足夠大的交易,不僅僅是您已經擁有的解決方案。 – BrenBarn 2014-10-08 07:59:58

回答

13

表明這一點的標準方法是分配你不想_結果。舉例來說,如果一個函數返回兩個值,但你只想要第一個,這樣做:

value, _ = myfunction(param) 

大多數Python的棉短絨是否承認所用的_,而不是抱怨未使用的變量。

如果你想忽略所有的回報,那麼根本不要分配任何東西;除非你告訴它,否則Python不會對結果做任何事情。打印結果只是Python shell中的一個功能。

+0

你不會忽略它,你將它分配給一個全局變量。引用nosklo:當你將gettext功能添加到別人的代碼(定義了一個叫'_'的函數)時,「這個」約定「很糟糕」,所以它應該被禁止。如果有人使用他們的最後輸出作爲輸入怎麼辦? – JohnJohn 2018-01-24 00:49:05

4

我真的很喜歡分配給空的想法 - 但它確實有一個意想不到的副作用:

>>> print divmod(5, 3) 
(1, 2) 
>>> x, null = divmod(5, 3) 
>>> print null 
2 

對於那些誰碼大多是在Python,這可能不是一個問題:空應該是公正儘可能多的垃圾價值_。

但是,如果您要在Javascript之類的其他語言之間切換,則完全可能會意外地使用null而不是None來編寫比較。 Python並沒有吐出與未知變量比較的常見錯誤,而只是默默接受它,現在你得到的是真實和錯誤的條件,你完全沒有想到......這是你盯着的那種錯誤一小時的代碼並不能確定是錯誤的,直到它突然襲擊你,你覺得自己像一個白癡。

明顯的修復不起作用,或者:

>>> x, None = divmod(5, 3) 
File "<stdin>", line 1 
SyntaxError: cannot assign to None 

...這實在是令人失望。 Python中(和地球上所有其他語言)允許的參數所有隱含扔掉,不管返回多少個變量:

>>> divmod(5, 3) 

...但明確扔掉參數通過分配給他們是不允許的?

它感覺有點愚蠢的Python解釋器的特點是分配給無作爲語法錯誤,而不是有意的選擇與明確的結果。任何人都可以想到一個理由嗎?