仅当值不是None时才应用函数的Python习惯用法

时间:2015-03-20 15:06:27

标签: python nonetype

函数正在接收许多值,这些值都是字符串,但需要以各种方式进行解析,例如

vote_count = int(input_1)
score = float(input_2)
person = Person(input_3)

这一切都很好,除了输入也可以是None,在这种情况下,我不想解析我希望最终分配到左侧的None的值。这可以通过

完成
vote_count = int(input_1) if input_1 is not None else None
...

但这似乎更不易读,尤其是像这样的许多重复行。我正在考虑定义一个简化这个的函数,比如

def whendefined(func, value):
    return func(value) if value is not None else None

可以像

一样使用
vote_count = whendefined(int, input_1)
...

我的问题是,这有一个共同的习惯用法吗?可能使用内置的Python函数?即使没有,这样的函数是否有一个常用的名称?

2 个答案:

答案 0 :(得分:3)

在其他语言中有Option typing,这有点不同(解决类型系统的问题),但有相同的动机(如何处理空值)。

在Python中,更多的是关注这种事情的运行时检测,所以你可以使用无检测保护包裹函数(而不是选项输入所做的数据)。

如果参数不是None,你可以写一个只执行函数的装饰器:

def option(function):
    def wrapper(*args, **kwargs):
        if len(args) > 0 and args[0] is not None:
          return function(*args, **kwargs)
    return wrapper

您应该调整第三行,使其更适合您正在使用的数据类型。

使用中:

@option
def optionprint(inp):
    return inp + "!!"

>>> optionprint(None)
# Nothing

>>> optionprint("hello")
'hello!!'

并带有返回值

@option
def optioninc(input):
    return input + 1

>>> optioninc(None)
>>> # Nothing

>>> optioninc(100)
101

或包装类型构造函数

>>> int_or_none = option(int)
>>> int_or_none(None)
# Nothing
>>> int_or_none(12)
12

答案 1 :(得分:1)

如果您可以安全地将虚假值(例如0和空字符串)视为无,则可以使用布尔值和:

vote_count = input_1 and int(input_1)

因为你看起来像是在输入字符串,所以这可能有用;无论如何,你无法将空字符串转换为int或float(或person)。虽然这个成语通常用在Lua中,但它对某些人来说并不是过于可读。