[英]Pythonic Solution to Multiple Checks
假設我有以下代碼:
var = foo()
if var:
return var
var = bar()
if var:
return var
var = baz()
if var:
return var
有沒有更Python化的方法來解決這個問題? 這樣的一個好用例是檢索用戶設置。 如果用戶對屏幕類型有特定設置,請使用它。 如果不是,請嘗試獲取並使用用戶的整個帳戶的屏幕類型。 如果不是,請使用系統范圍的通用屏幕類型。
顯然,這種情況很小,可能還可以。 假設我有100多個“案例”要檢查優先級列表。 我認為我們都可以同意這可能是荒謬的。
編輯:很抱歉,如果這似乎是一個XY問題。 從某種意義上講,我想。 這是100%的學術思想練習。 我實際上沒有特定的用例。 這只是昨晚我在考慮的事情,並且想知道最Python化的方法是什么。
return foo() or bar() or baz()
應該這樣做。
我認為user161151的解決方案很好,但是如果您希望維護數十個甚至100個功能,則可以執行以下操作:
lst = [foo, bar, baz, ...] # add to this list
for func in lst:
v = func()
if v:
return v
您可以遍歷函數並采用第一個返回布爾True
的函數:
var = next(filter(None, (fn() for fn in (foo, bar, baz))))
編輯 :當我測試它時,它崩潰了,然后我意識到在Python 2.x過濾器中返回一個列表,而在Python 3.x過濾器中返回一個生成器。 有關Python 2.x的示例,請參見下文:
def f1():
print 'called f1'
return False
def f2():
print 'called f2'
return None
def f3():
print 'called f3'
return 'yay'
def f4():
print 'called f4'
return 'yay1'
from itertools import ifilter
var = next(ifilter(None, (fn() for fn in (f1, f2, f3, f4))))
print var
輸出:
called f1
called f2
called f3
yay
>>>
for f in [foo, bar, baz]:
t = f()
if t:
return t
如果函數的數量可以無限增長,我可能會做類似的事情:
functions = [
foo,
bar,
baz
]
for fn in functions:
var = fn()
if var:
return var
# some sort of error handling maybe?
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.