2017-02-16 83 views
1

如果值不是變量的值None,或者分配不同的值或另一個不同的值,我希望爲返回的函數分配一些值... 僅我想要調用一次該功能。使用從函數調用鏈返回的值分配變量

我目前使用tryexcept TypeError,但只適用於兩個選項,不是很乾淨。

try: 
    value = someFunction()["content"] 
except KeyError: 
    value = someOtherFunction()["content"] 
+0

這些都是字典吧? –

+0

@WillemVanOnsem是的,特別是BeautifulSoup結果 – david8

+0

是'someFunction()「內容」]''其實是None'or那裏的dictionnary只是沒有「內容」字段? – bouletta

回答

0
value = someFunction()["content"] if ("content" in someFunction() and someFunction()["content"] != None) else someOtherFunction()["content"] 

雖然這個someFunction將被稱爲潛在多次,所以你可能想通過d在oneliner前加

d = someFunction() 

和替換someFunction()

+0

你仍然有KeyError異常可能必然發生 – Gigapalmer

+0

'價值= someFunction()[「內容」]如果「內容」someFunction其他do_something' – Gigapalmer

+0

@Gigapalmer以及因此,我對這個問題的評論。如果字典中的「content」是肯定的,那麼就不會有'KeyError'。否則我同意 – bouletta

1

會有這樣的工作嗎?

def try_run(func_list, field, default_value): 
    for f in func_list: 
    try: 
     value = f()[field] 
     return value 
    except (TypeError, KeyError): 
     pass 
    return default_value 

try_run([someFunction, someOtherFunction], 'content', 'no content') 

Sample Code

0

如果someFunction返回一個字典,你可以使用

dict_object = someFunction() 
if 'content' in dict_object.keys() and dict_object['content'] is not None: 
    value = dict_object['content'] 
else: 
    value = someOtherFunction['content'] 
+0

順便說一句,第一個是更好的方式。但dict_object.keys()中的'content'與dict_object中的'content'相比要慢一些,因爲調用keys()會返回整個鍵列表。 我更喜歡 - >''內容'在dict_object' – Gigapalmer

3

由於返回值是dict類型的,你可以使用dict.get實現一個線相同的行爲as:

value = someFunction().get("content", someOtherFunction()["content"]) 

但是這個如果您只處理問題中提到的兩個值,那麼它們將適用。對於處理多種功能鏈,您可以創建功能列表,併爲您在返回的字典對象中的「關鍵」爲:

my_functions = [func1, func2, func3] 

for func in my_functions: 
    returned_val = func() 
    if 'content' in returned_val: # checks for 'content' key in returned `dict` 
     value = returned_val['content'] 
     break 
1

這需要一個外部庫,但你可以使用iteration_utilities.first

from iteration_utilities import first 

# The logic that you want to execute for each function (it's the same for each function, right?) 
def doesnt_error(func): 
    try: 
     return func()['content'] 
    except (KeyError, TypeError): 
     return False 

# some sample functions 
func1 = lambda: None 
func2 = lambda: {} 
func3 = lambda: {'content': 'what?'} 

# A tuple containing all functions that should be tested. 
functions = (func1, func2, func3) 

# Get the first result of the predicate function 
# the `retpred`-argument ensures the function is only called once. 
value = first(functions, pred=doesnt_error, retpred=True) 

1這是從我寫的第三方庫:iteration_utilities

相關問題