首页 > 解决方案 > 为什么该函数为 None 对象返回 False

问题描述

我有一个函数应该检查传入的对象是否被允许。

为什么此功能因无类型而失败。

def is_valid_object(obj):
    allowed_types = [int, bool, None]
    return type(obj) in allowed_types

为...卖力:

is_valid_object('i am string')预期False=> 回报False

is_valid_object(10)预期True => 回报True

is_valid_object(False)预期True=> 回报True


为什么会失败:

is_valid_object(None)预期True=> 回报False

标签: pythonpython-3.x

解决方案


None不是类型,它是类型的单个值NoneType。用于type(None)访问该类型以将其放入允许的类型列表中:

allowed_types = [int, bool, type(None)]

在我看来,最好只用 显式测试None单例obj is None,因为这在意图上更加清晰:

allowed_types = [int, bool]
return obj is None or type(obj) in allowed_types

type(obj) in allowed_types考虑使用isinstance()元组第二个参数,而不是 using :

def is_valid_object(obj):
    return obj is None or isinstance(obj, (int, bool))

可以简化为:

def is_valid_object(obj):
    return obj is None or isinstance(obj, int)

因为bool是 的子类int

演示:

>>> def is_valid_object(obj):
...     return obj is None or isinstance(obj, int)
...
>>> is_valid_object(42)
True
>>> is_valid_object(False)
True
>>> is_valid_object(None)
True
>>> is_valid_object('Hello world!')
False

推荐阅读