如何在Python中“测试”NoneType?

667

我有一个方法,有时会返回NoneType值。那么如何判断一个NoneType变量?我需要使用 if 方法,例如:

方法有时候会返回NoneType值,如何判断一个NoneType变量?需要使用if语句。

if not new:
    new = '#'

我知道那不是正确的方式,我希望你能理解我的意思。


我认为这个问题已经在这里得到了回答(https://dev59.com/X2Yq5IYBdhLWcg3wui_F),而且显然之前也有过类似的讨论。 - yorodm
如果你的方法只返回None这个值,使得bool(returnValue)等于False,那么if not new:应该可以正常工作。这在内置库中有时会发生——例如,re.match要么返回None,要么返回一个真值匹配对象。 - Kevin
也可以在这里查看我的有关Python中nullNone的回答链接 - Michael Ekoka
9个回答

985

那么我如何查询一个值为NoneType的变量?

使用is运算符,像这样:

if variable is None:

为什么这样能行?

在Python中,NoneNoneType的唯一单例对象,因此我们可以使用is运算符来检查变量中是否有None

引用自is文档,

运算符isis not测试对象标识:x is y当且仅当xy是同一对象时为True。 x is not y则相反。

由于只能存在一个None实例,因此is是检查None的首选方式。


了解最佳实践

引用Guido本人所定义的Python编码风格指南-PEP-008

与单例(如None)的比较应始终使用isis not运算符,而不是等式运算符。


6
== Noneis None 有什么区别? - NoName
@NoName 关于 None,它们两个将产生类似的结果。 - thefourtheye
8
如果要比较一个 pandas DataFrame 是否存在,那么这种做法行不通 -- 对于这种情况,我使用 type(df) is type(None) 来避免出现 The truth value of a DataFrame is ambiguous 的错误提示。 - Marc Maxmeister
10
应该添加isinstance(instance, type(None))来使这个答案更完整,因为存在边界情况。例如,如果您正在构建用于验证的动态类型元组,并且验证器正在使用isinstance(它接受一个元组作为参数)。 - Rafe
我们可以这样写吗:if not variable: - alper
显示剩余3条评论

136
if variable is None:
   ...

if variable is not None:
   ...

错误。如果变量不是 None: - Gregory Morse

70

根据Alex Hall的回答,也可以使用isinstance来实现:

>>> NoneType = type(None)
>>> x = None
>>> type(x) == NoneType
True
>>> isinstance(x, NoneType)
True

isinstance很直观,但它需要包含这一行:

NoneType = type(None)

对于像intfloat这样的类型,这并不需要。


3
由于您无法对“NoneType”进行子类化,而且“None”是单例模式,因此不应使用isinstance来检测“None” - 相反,您应该像接受的答案所说的那样使用is Noneis not None - Russia Must Remove Putin
12
有一些特殊情况。例如,如果您正在构建一个用于验证的动态类型列表,并且验证器正在使用isinstance(需要传入一个列表作为参数)。 - Rafe
1
更正:元组,而不是列表。 - Rafe
2
此外,assert isinstance(x, str) or x is None 不会导致 Pyright 推断 xstr | None,但 assert isinstance(x, (str, type(None))) 会。 - Timmmm
鉴于当前的isinstance文档没有提到这个情况,我认为这是有效的Python代码。但是,如果你使用mypy,请注意目前未解决的问题 - Gabriel Devillers

36
如Aaron Hall的评论所指出:
由于无法对NoneType进行子类化,而且None是一个单例,因此不应使用isinstance来检测None - 相反,应该像接受的答案所说的那样,使用is None或is not None。

原始答案:

然而,最简单的方法,除了 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))

4
由于无法对 NoneType 进行子类化且 None 是单例,因此不应使用 isinstance 来检测 None。相反,您应该按照被接受的答案所说的那样使用 is Noneis not None - Russia Must Remove Putin
5
为什么不应该使用 isinstance?我知道 is 应该更受推荐,但有些情况下使用 isinstance 更自然(比如同时检查多个类型 isinstance(x, (str, bool, int, type(None))))。这只是个人喜好还是有我不知道的警告? - Conchylicultor
2
@Conchylicultor 的建议有以下缺点:1. 全局查找 type 2. 然后调用它 3. 然后查找 None 的类型 - 当 None 同时是单例和关键字时。另一个缺点是:4. 这非常不标准,当人们查看您的代码时会引起注意。x is None 是更优化的检查方式。我建议使用 x is None or isinstance(x, (str, bool, int)) - 但我也建议您在进行此类类型检查时更多地考虑您正在做什么,特别是对于没有太多共同点的类型。 - Russia Must Remove Putin

19

我不确定这是否回答了问题,但我知道我花了一些时间才搞明白。我一直在浏览一个网站,然后突然发现作者的姓名不再显示了。所以需要一个检查语句。

if type(author) == type(None):
     print("my if body")
else:
     print(" my else body")

在这种情况下,作者可以是任何变量,而None可以是您要检查的任何类型。


2
由于None是一个单例,因此不应使用type来检测None - 相反,您应该像接受的答案所说的那样使用is Noneis not None - Russia Must Remove Putin
什么是 my else body?! - jtlz2
1
@jtlz2 抱歉,我应该澄清一下。我的 else 语句体是任何你想要在 else 语句执行时发生的代码。如果你想知道它是否是受保护的 Python 用语,那么不是。 - Josh Pachner

2

Python 2.7 :

x = None
isinstance(x, type(None))

或者

isinstance(None, type(None))

==> 真


3
由于无法对NoneType进行子类化,而None是单例,因此不应使用isinstance来检测None - 相反,您应该像接受的答案所说的那样使用is Noneis not None - Russia Must Remove Putin
这个如何被复制到每一个答案,不错-- - Silvan Bregy

0
我希望这个例子对你有所帮助)
print(type(None))  # NoneType

所以,您可以检查变量名称的类型。
# Example
name = 12  # name = None

if type(name) is type(None):
    print("Can't find name")
else:
    print(name)

因为None是单例并且NoneNoneType的唯一实例,所以你的示例比必要的更复杂。只需检查变量是否为Noneif name is None: ... - sausix

0
我通常使用以下方法检查NoneType。
if (new): # not None
  ...
else: # NoneType
  ...

0
你可以通过导入来明确测试 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)

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接