如何在 python 中“测试”NoneType?

Posted

技术标签:

【中文标题】如何在 python 中“测试”NoneType?【英文标题】:How to "test" NoneType in python? 【发布时间】:2014-05-29 23:09:21 【问题描述】:

我有一个有时会返回 NoneType 值的方法。那么我怎么能质疑一个 NoneType 的变量呢?我需要使用 if 方法,例如

if not new:
    new = '#'

我知道那是错误的方式,我希望你明白我的意思。

【问题讨论】:

我认为这是here 的回答,显然之前的某个地方 如果 None 是您的方法返回的唯一值,bool(returnValue) 等于 False,那么 if not new: 应该可以正常工作。这有时会发生在内置库中 - 例如,re.match 返回 None 或真实匹配对象。 另见我在 python here 中对nullNone 的回答。 【参考方案1】:

那么我该如何质疑一个 NoneType 的变量呢?

使用is 运算符,像这样

if variable is None:

为什么会这样?

由于None是Python中NoneType的唯一单例对象,我们可以使用is运算符来检查变量中是否包含None

引用is docs,

运算符isis not 测试对象身份:当且仅当xy 是同一个对象时,x is y 为真。 x is not y 产生逆真值。

由于None 只能有一个实例,is 将是检查None 的首选方式。


从马口中听到

引用Python's Coding Style Guidelines - PEP-008(Guido 本人共同定义),

None 等单例的比较应始终使用 isis not永远不要使用相等运算符

【讨论】:

那么== Noneis None有什么区别? @NoName 对于None,它们都会产生相似的结果。 如果比较 pandas DataFrame 是否存在,这不起作用——为此,我使用 type(df) is type(None) 来避免:The truth value of a DataFrame is ambiguous @NoName 见Python None comparison: should I use “is” or ==? isinstance(instance, type(None)) 应添加以使其成为完整的答案。有边缘情况。例如,如果您正在构建一个动态类型的元组进行验证,并且验证器正在使用 isinstance(它接受一个元组)。【参考方案2】:
if variable is None:
   ...

if variable is not None:
   ...

【讨论】:

【参考方案3】:

也可以按照Alex Hall's answer 使用isinstance 来完成:

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

isinstance 也很直观,但复杂的是它需要一行

NoneType = type(None)

intfloat 等类型不需要。

【讨论】:

由于您不能继承 NoneType 并且由于 None 是单例,因此不应使用 isinstance 来检测 None - 相反,您应该按照公认的答案进行操作,并且使用is Noneis not None 有边缘情况。例如,如果您正在构建用于验证的动态类型列表,并且验证器正在使用isinstance(它需要一个列表)。 更正:元组,而不是列表【参考方案4】:

正如 Aaron Hall 的评论所指出的:

由于您不能继承 NoneType 并且由于 None 是单例,因此不应使用 isinstance 来检测 None - 相反,您应该按照公认的答案进行操作,并使用 is Noneis not None.


原答案:

然而,除了cardamom's answer 之外没有额外的行,最简单的方法可能是:isinstance(x, type(None))

那么我如何质疑一个 NoneType 的变量呢?我需要使用 if 方法

使用isinstance() 不需要在if 语句中使用is

if isinstance(x, type(None)): 
    #do stuff

其他信息 您还可以在documentation 中提到的一个isinstance() 语句中检查多种类型。只需将类型写为元组即可。

isinstance(x, (type(None), bytes))

【讨论】:

由于您不能继承 NoneType 并且由于 None 是单例,因此不应使用 isinstance 来检测 None - 相反,您应该按照公认的答案进行操作,并且使用is Noneis not None @AaronHall 为什么isinstance不应该被使用?我知道应该首选is,但在某些情况下,isinstance 表单感觉更自然(比如一次检查多种类型isinstance(x, (str, bool, int, type(None))))。这只是个人喜好还是有我不知道的警告? @Conchylicultor 对您的建议不利:1. 全局查找 type 2. 然后调用它 3. 然后查找 None 的类型 - 当 None 都是单例时和一个关键字。另一个缺点: 4. 这是非常不标准的,当人们查看您的代码时会引起注意。 x is None 是更优化的检查。我建议x is None or isinstance(x, (str, bool, int)) - 但我也建议你在对没有太多共同点的类型进行那种类型检查时多想想你在做什么......【参考方案5】:

不确定这是否能回答问题。但我知道这花了我一段时间才弄清楚。我正在浏览一个网站,突然之间不再有作者的名字了。所以需要一个检查语句。

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

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

【讨论】:

由于None 是一个单例,type 不应该用于检测None - 相反,您应该按照公认的答案进行操作,并使用is Noneis not None WTH 是my else body?! @jtlz2 抱歉,我应该澄清一下。如果执行 else 语句,我的 else 正文是您想要发生的任何代码。如果您想知道,它不是受保护的 Python 措辞【参考方案6】:

Python 2.7:

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

isinstance(None, type(None))

==> 是的

【讨论】:

由于您不能继承 NoneType 并且由于 None 是单例,因此不应使用 isinstance 来检测 None - 相反,您应该按照公认的答案进行操作,并且使用is Noneis not None【参考方案7】:

希望这个例子对你有所帮助)

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 的唯一实例,所以您的示例比必要的复杂。只需检查None 的变量:if name is None: ...

以上是关于如何在 python 中“测试”NoneType?的主要内容,如果未能解决你的问题,请参考以下文章

Python中的Nonetype类型判断

如何正确使用单元测试的 assertRaises() 和 NoneType 对象? [复制]

Python TypeError:“NoneType”类型的对象没有 len()

TypeError:“NoneType”对象在 Python 中不可迭代

从列表中删除 NoneType 元素的本机 Python 函数?

Python 3.x 中的 NoneType 在哪里?