是否可以评估函数返回是否在列表中,否则返回默认值?

如果我有一个返回某个值的函数,并且我只想在允许的列表中分配该值,否则使用默认值。假设我无法修改该功能。


即这有效,但它调用该函数两次。


def some_func():

    return 'foo'


allowed_list = ['foo', 'bar']

value = some_func() if some_func() in allowed_list else 'default'

有没有一种Python式的方法可以在一行中设置值而无需调用函数两次?


繁华开满天机
浏览 130回答 3
3回答

HUX布斯

从 Python 3.8开始:value = x if (x:=foo()) in allowed_list else 'default'

MM们

如果您喜欢做一些过度的事情来完成简单的任务(赋值表达式/海象运算符),请定义一个装饰器来为您处理返回值:allowed_list = ['foo', ]def check_return_value(fn):    def inner(*args, **kwargs):        result = fn(*args, **kwargs)        return result if result in allowed_list else 'default'    return inner# suppose this name is imported from somewhere else and you can't use @ syntaxdef some_func():    return 'boo'some_func = check_return_value(some_func)var = some_func()print(var)  # prints "default"

蝴蝶刀刀

只要您仅限于 Python 3.6 并且不能使用赋值表达式,您就可以为自己创建一个辅助函数来处理这个问题。def some_func():    return 'foo'def default_if_invalid(value, allowed_values, default):    return value if value in allowed_values else defaultallowed_list = ['foo', 'bar']value = default_if_invalid(some_func(), allowed_list, 'default')None如果您始终检查相同的允许值列表,或者如果您希望该方法在未提供默认值的情况下提供默认值(也许),则可以轻松修改此值。例如:def default_if_invalid(value, default=None):    allowed_list = ['foo', 'bar']    return value if value in allowed_values else defaultvalue = default_if_invalid(some_func()) # sets to None if not in listvalue = default_if_invalid(some_func(), 'default') # specifies a default
打开App,查看更多内容
随时随地看视频慕课网APP

相关分类

Python