我有一个方法,有时会返回NoneType值。那么如何判断一个NoneType变量?我需要使用 if 方法,例如:
方法有时候会返回NoneType值,如何判断一个NoneType变量?需要使用if语句。
if not new:
new = '#'
我知道那不是正确的方式,我希望你能理解我的意思。
那么我如何查询一个值为NoneType的变量?
使用is
运算符,像这样:
if variable is None:
为什么这样能行?
在Python中,None
是NoneType
的唯一单例对象,因此我们可以使用is
运算符来检查变量中是否有None
。
引用自is
文档,
运算符
is
和is not
测试对象标识:x is y
当且仅当x
和y
是同一对象时为True。x is not y
则相反。
由于只能存在一个None
实例,因此is
是检查None
的首选方式。
了解最佳实践
引用Guido本人所定义的Python编码风格指南-PEP-008,
与单例(如
None
)的比较应始终使用is
或is not
运算符,而不是等式运算符。
== None
和 is None
有什么区别? - NoNameNone
,它们两个将产生类似的结果。 - thefourtheyepandas
DataFrame 是否存在,那么这种做法行不通 -- 对于这种情况,我使用 type(df) is type(None)
来避免出现 The truth value of a DataFrame is ambiguous
的错误提示。 - Marc Maxmeisterisinstance(instance, type(None))
来使这个答案更完整,因为存在边界情况。例如,如果您正在构建用于验证的动态类型元组,并且验证器正在使用isinstance
(它接受一个元组作为参数)。 - Rafeif not variable:
? - alperif variable is None:
...
if variable is not None:
...
根据Alex Hall的回答,也可以使用isinstance
来实现:
>>> NoneType = type(None)
>>> x = None
>>> type(x) == NoneType
True
>>> isinstance(x, NoneType)
True
isinstance
很直观,但它需要包含这一行:
NoneType = type(None)
对于像int
和float
这样的类型,这并不需要。
isinstance
来检测“None” - 相反,您应该像接受的答案所说的那样使用is None
或is not None
。 - Russia Must Remove Putinisinstance
(需要传入一个列表作为参数)。 - Rafeassert isinstance(x, str) or x is None
不会导致 Pyright 推断 x
为 str | None
,但 assert isinstance(x, (str, type(None)))
会。 - Timmmm原始答案:
然而,最简单的方法,除了 cardamom's answer 外,可能是:
isinstance(x, type(None))
那么我如何询问一个变量是否为 NoneType?我需要使用 if 方法
使用 isinstance()
不需要在 if
语句中使用 is
:
if isinstance(x, type(None)):
#do stuff
额外信息
您也可以像文档中提到的那样,在一个isinstance()
语句中检查多个类型。只需将类型写成元组即可。
isinstance(x, (type(None), bytes))
NoneType
进行子类化且 None
是单例,因此不应使用 isinstance
来检测 None
。相反,您应该按照被接受的答案所说的那样使用 is None
或 is not None
。 - Russia Must Remove Putinisinstance
?我知道 is
应该更受推荐,但有些情况下使用 isinstance
更自然(比如同时检查多个类型 isinstance(x, (str, bool, int, type(None)))
)。这只是个人喜好还是有我不知道的警告? - Conchylicultortype
2. 然后调用它 3. 然后查找 None
的类型 - 当 None
同时是单例和关键字时。另一个缺点是:4. 这非常不标准,当人们查看您的代码时会引起注意。x is None
是更优化的检查方式。我建议使用 x is None or isinstance(x, (str, bool, int))
- 但我也建议您在进行此类类型检查时更多地考虑您正在做什么,特别是对于没有太多共同点的类型。 - Russia Must Remove Putin我不确定这是否回答了问题,但我知道我花了一些时间才搞明白。我一直在浏览一个网站,然后突然发现作者的姓名不再显示了。所以需要一个检查语句。
if type(author) == type(None):
print("my if body")
else:
print(" my else body")
在这种情况下,作者可以是任何变量,而None
可以是您要检查的任何类型。
None
是一个单例,因此不应使用type
来检测None
- 相反,您应该像接受的答案所说的那样使用is None
或is not None
。 - Russia Must Remove Putinmy else body
?! - jtlz2Python 2.7 :
x = None
isinstance(x, type(None))
或者
isinstance(None, type(None))
==> 真
NoneType
进行子类化,而None
是单例,因此不应使用isinstance
来检测None
- 相反,您应该像接受的答案所说的那样使用is None
或is not None
。 - Russia Must Remove Putinprint(type(None)) # NoneType
# Example
name = 12 # name = None
if type(name) is type(None):
print("Can't find name")
else:
print(name)
None
是单例并且None
是NoneType
的唯一实例,所以你的示例比必要的更复杂。只需检查变量是否为None
:if name is None: ...
- sausixif (new): # not None
...
else: # NoneType
...
NoneType
。>>> from types import NoneType
>>> NoneType = type(None)
None
。现在你想要使用单个isinstance
调用来验证其类型:>>> from types import NoneType
>>> foo = 'bar'
>>> assert isinstance(foo, (str, NoneType))
>>> assert isinstance(foo, str) or isinstance(foo, NoneType)
>>> assert isinstance(foo, str) or (foo is None)
None
这个值,使得bool(returnValue)
等于False
,那么if not new:
应该可以正常工作。这在内置库中有时会发生——例如,re.match
要么返回None
,要么返回一个真值匹配对象。 - Kevinnull
和None
的回答链接。 - Michael Ekoka