[英]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_1
和var_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.