为什么函数为None对象返回False

时间:2019-04-13 17:41:04

标签: python python-3.x

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

为什么此功能无法无输入。

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

3 个答案:

答案 0 :(得分:6)

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

考虑将here与元组第二个参数一起使用,而不是使用type(obj) in allowed_types

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)

因为boolint的子类。

演示:

>>> 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

答案 1 :(得分:2)

intbool不同,type(None)不等于None

print(type(None))
  

NoneType

要解决此问题,您可以执行以下操作:

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

输出

print(is_valid_object(None))
  

答案 2 :(得分:0)

IN_CLOSE_WRITE是一个值,而不是类型。 None的类型没有内置名称。要么使用

None

或(仅适用于Python 2)

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

无论哪种方式,都可以使用from types import NoneType def is_valid_object(obj): allowed_types = [int, bool, NoneType] return type(obj) in allowed_types 而不是类型比较来简化(并使功能更正确)。

isinstance

(由于def is_vali_object(obj): return isinstance(obj, (int, bool, type(None))) 是其类型的 only 值,因此更容易直接将Martijn Pieters shows作为documentation of create-react-app来检查None。)