簡體   English   中英

多重檢查的Pythonic解決方案

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

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