如果值不是None
变量,我想为函数返回一些值,或者指定不同的值,或者另一个不同的值...
我只想调用一次这个函数。
我目前使用的是try
和except TypeError
,但只适用于两个选项而且不是很干净。
try:
value = someFunction()["content"]
except KeyError:
value = someOtherFunction()["content"]
答案 0 :(得分:3)
由于返回的值属于dict
类型,因此您可以使用dict.get
在单行中实现相同的行为:
value = someFunction().get("content", someOtherFunction()["content"])
但如果你只处理问题中提到的两个值,这将适用。为了处理多个函数链,您可以创建一个函数列表并检查返回的dict对象中的“键”:
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 :(得分: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')
答案 2 :(得分: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
。
答案 3 :(得分:0)
value = someFunction()["content"] if ("content" in someFunction() and someFunction()["content"] != None) else someOtherFunction()["content"]
尽管如此,someFunction可能会被多次调用,因此您可能想要添加
d = someFunction()
之前并在oneliner中用d替换someFunction()
答案 4 :(得分:0)
如果someFunction返回字典,则可以使用
/^[a-zA-Z](?=.*?[a-z])(?=.*?[A-Z])(?=.*?[0-9]).{8,}$/