使用函数调用链返回的值赋值变量

时间:2017-02-16 20:27:04

标签: python

如果值不是None变量,我想为函数返回一些值,或者指定不同的值,或者另一个不同的值... 我只想调用一次这个函数。

我目前使用的是tryexcept TypeError,但只适用于两个选项而且不是很干净。

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

5 个答案:

答案 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')

Sample Code

答案 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,}$/