簡體   English   中英

當期望多個返回值時,如何從函數中很好地返回

[英]How to return from function nicely when multiple return values expected

myFunct應該返回兩個值。 兩個返回的值都捕獲到var_1, var_2

作為錯誤檢查,我在被調用的函數范圍內使用了if/else: return語句(在本例中為myFunct )。 if arg<10: return鍵入簡單, if arg<10: return返回單個 None ,引發TypeError: 'NoneType' object is not iterable因為有兩個變量: var_1, var_2 = myFunct(5)期望兩個返回值,但僅返回單個值None

為了避免出現這樣的錯誤,我必須使用以下語法:

if arg<10: return None, None

我覺得這很丑。

我想知道是否有更好的方法...

def myFunct(arg):
    if arg<10:
        return
    return 100, 200

var_1, var_2 = myFunct(5)

如果發生故障,正確的解決方案是引發異常。 但是,如果您絕對不想這樣做,則可以始終:

try:
    var_1, var_2 = myFunct(5)
except TypeError:
    var_1, var_2 = (None,None)

編輯:

如果var_1var_2確實為None,則可能需要考慮如何var_2它們。 如果要繼續進行計算,無輸入是有效輸入,則可能return None,None是正確的表達式。 但是,如果這是一個例外,並且您將注意到結果為“無”,並且執行完全不同的操作(沒有兩個值),則始終可以執行以下操作:

result = myFunct(5)
if result:
    var_1,var_2=result
    do_more_stuff_here_with(var_1 and var_2) # logical and :)
else:
    print "myFunct(5) failed - check (and if necessary adjust) the phase of the moon"

盡管這值得商bat,但通常認為只有一個出口即可 換句話說,只有一個return語句。 您可以按以下步驟完成此操作,

def myFunc(arg):
    result1, result2 = None, None
    if not arg < 10:
        result1, result2 = 100,200
    return result1, result2

現在顯然,您的玩具示例非常簡單,甚至可以使用更多的python方式簡化此特定示例,例如:

def myFunc(arg):
    return (None, None) if arg < 10 else (100,200)

但是, 單點退出是進入我的復雜功能的一個好習慣。

正如其他人指出的那樣,引發異常是表示函數達到錯誤狀態的最Python方式。 作為返回值的None返回值通常僅應基本上表示一個空列表的等效項,即IE,其中無返回值是該功能的預期可能結果。

可愛的裝飾師怎么樣?

import decorator

def default_return_value(value):
    @decorator.decorator
    def decorate(f, *args, **kwargs):
        x = f(*args, **kwargs)
        return value if x is None else x
    return decorate

def returns_tuple(size):
    return default_return_value(tuple([None] * size))

@returns_tuple(size=2)
def myFunct(arg):
    if arg >= 10:
        return 100, 200

>>> myFunct(15)
(100, 200)

>>> myFunct(5)
(None, None)

將結果存儲在單個變量中,然后根據需要擴展

result = myFunct(5)
var_1, var_2 = (None, None) if result is None else result

暫無
暫無

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

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