如果值不是變量的值None
,或者分配不同的值或另一個不同的值,我希望爲返回的函數分配一些值... 僅我想要調用一次該功能。使用從函數調用鏈返回的值分配變量
我目前使用try
和except TypeError
,但只適用於兩個選項,不是很乾淨。
try:
value = someFunction()["content"]
except KeyError:
value = someOtherFunction()["content"]
如果值不是變量的值None
,或者分配不同的值或另一個不同的值,我希望爲返回的函數分配一些值... 僅我想要調用一次該功能。使用從函數調用鏈返回的值分配變量
我目前使用try
和except TypeError
,但只適用於兩個選項,不是很乾淨。
try:
value = someFunction()["content"]
except KeyError:
value = someOtherFunction()["content"]
value = someFunction()["content"] if ("content" in someFunction() and someFunction()["content"] != None) else someOtherFunction()["content"]
雖然這個someFunction將被稱爲潛在多次,所以你可能想通過d在oneliner前加
d = someFunction()
和替換someFunction()
你仍然有KeyError異常可能必然發生 – Gigapalmer
'價值= someFunction()[「內容」]如果「內容」someFunction其他do_something' – Gigapalmer
@Gigapalmer以及因此,我對這個問題的評論。如果字典中的「content」是肯定的,那麼就不會有'KeyError'。否則我同意 – bouletta
會有這樣的工作嗎?
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')
如果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']
順便說一句,第一個是更好的方式。但dict_object.keys()中的'content'與dict_object中的'content'相比要慢一些,因爲調用keys()會返回整個鍵列表。 我更喜歡 - >''內容'在dict_object' – Gigapalmer
由於返回值是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
這需要一個外部庫,但你可以使用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
。
這些都是字典吧? –
@WillemVanOnsem是的,特別是BeautifulSoup結果 – david8
是'someFunction()「內容」]''其實是None'or那裏的dictionnary只是沒有「內容」字段? – bouletta