我有一个应该检查传入对象是否被允许的函数。
为什么此功能无法无输入。
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
答案 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)
因为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
答案 1 :(得分:2)
与int
和bool
不同,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
。)