2016-08-16 53 views
0

我想改寫這個Pythonically:特別是否有一種調用單個對象的許多成員的Pythonic方式?

if not x.v1() 
    if not x.v2() 
    if not x.v3() 
     return 'validated' 
return 'invalid' 

注意,如果x.v1()沒有通過,x.v2()x.v3()甚至沒有運行。

這是我迄今爲止最好的主意:

import operator 

for method in ['v1', 'v2', 'v3']: 
    if operator.methodcaller(method)(x): 
    return 'invalid' 
return 'validated' 

,但我覺得有絕對是一個更Python的方式。

澄清:的函數的數量很大,甚至可能在運行時改變能改變的,所以雖然x.v1() or x.v2() or x.v3()肯定看起來更好,這是不可能的,陣列確實是必要的。 (也就是說,如果有更好的方法比用所有這些字符串寫出更好的方法,請告訴我這件事!)對不清楚的問題抱歉。

回答

5

只需反轉邏輯即可。

if x.v1() or x.v2() or x.v3(): 
    return 'invalid' 
return 'validated' 
+0

這實際上比「全部」或「任何」版本更容易閱讀。 –

+0

@Karin:好的,謝謝。 –

0

請特別注意,如果x.v1()不通過,x.v2()和x.v3()是 甚至無法運行。

我想你的意思是 「如果不x.v1()沒有通過,x.v2()和x.v3()都不能運行。」這與「如果x.v1()通過,x.v2()和x.v3()甚至不運行」...和'無效'返回相同。因爲Python短路表達式求值,下面是短路evauation的聲明的意圖重寫代碼的OP的Python化的方式:

if x.v1() or x.v2() or x.v3(): 
    return 'invalid' 
else: 
    return 'validated' 
1

如果你想支持的功能任意數量,這是值得一推出自己的anyall版本的方法列表:

def any_fn(*funcs): 
    return any(f() for f in funcs) 

def all_fn(*funcs): 
    return all(f() for f in funcs) 

然後你就可以說:

if any_fn(x.v1, x.v2, x.v3): 
    return 'invalid' 
else: 
    return 'valid' 
相關問題