如何在Python中“测试” NoneType?


398

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

if not new:
    new = '#'

我知道这是错误的方式,希望您能理解我的意思。


我认为这是在这里并且显然在以前的某个地方得到了答复
yorodm 2014年

如果None是您的方法返回的唯一值bool(returnValue)等于False,则if not new:应该工作正常。有时在内置库中会发生这种情况-例如,re.match返回None或真实匹配对象。
凯文(Kevin)

还看到我的回答null,并None在Python 这里
Michael Ekoka,

Answers:


631

那么我如何质疑一个无类型的变量呢?

is像这样使用运算符

if variable is None:

为什么这样有效?

由于NoneNoneTypePython中唯一的单例对象,因此我们可以使用isoperator来检查变量None中是否包含变量。

引用is文档

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

由于只能有一个实例Noneis因此是检查的首选方法None


从马口中听到

引用Python的编码样式指南-PEP-008(由Guido亲自定义),

与单例之类的比较None应该总是用isis not不是等式运算符进行


那么== None和之间有什么区别is None
NoName

@NoName关于None,它们都将产生相似的结果。
thefourtheye

1
如果比较pandasDataFrame 是否存在,这将不起作用-为此,我type(df) is type(None)避免使用:The truth value of a DataFrame is ambiguous
Marc Maxmeister


27

也可以isinstance按照Alex Hall的回答来完成:

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

isinstance 也很直观,但有一个复杂之处,那就是需要

NoneType = type(None)

对于像int和这样的类型,则不需要float


由于您不能继承子类,NoneType并且由于None是单例,isinstance因此不应将其用于检测None-而是应按照已接受的答案进行操作,并使用is Noneis not None
亚伦·霍尔

18

正如亚伦·霍尔的评论所指出的:

由于您不能继承子类,NoneType并且由于None是单例,isinstance因此不应将其用于检测None-而是应按照已接受的答案进行操作,并使用is Noneis not None


原始答案:

但是,最简单的方法,除了豆蔻果实的答案外,没有多余内容可能是:
isinstance(x, type(None))

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

使用isinstance()不需要is的内if语句来:

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

其他信息
您还可以isinstance()按照文档中的说明在一个语句中检查多种类型。只需将类型写为元组即可。

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

1
由于您不能继承子类,NoneType并且由于None是单例,isinstance因此不应将其用于检测None-而是应按照已接受的答案进行操作,并使用is Noneis not None
亚伦·霍尔

1
这个答案对python 3.6.7
Santhosh Dhaipule Chandrakanth 18'Dec

@AaronHall为什么isinstance 应该使用?我知道is应该优先考虑,但是在某些情况下,isinstance表单感觉更自然(例如,一次检查多种类型isinstance(x, (str, bool, int, type(None))))。仅仅是个人喜好还是我没有意识到的警告?
Conchylicultor

@Conchylicultor不利于您的建议:1.全局查找type2.然后调用它3.然后查找None- None单身人士还是关键字的类型。另一个缺点:4.这是非常不标准的,当人们查看您的代码时会引起人们的注意。x is None是更优化的检查。我会建议x is None or isinstance(x, (str, bool, int))-但我也建议您多考虑一下在进行类型检查时,对于没有太多共同点的类型所做的事情……
Aaron Hall

4

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

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

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


由于None是单例,type因此不应用于检测None-而是应按照接受的答案进行操作,并使用is Noneis not None
亚伦·霍尔

2

Python 2.7:

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

要么

isinstance(None, type(None))

==>正确


1
由于您不能继承子类,NoneType并且由于None是单例,isinstance因此不应将其用于检测None-而是应按照已接受的答案进行操作,并使用is Noneis not None
亚伦·霍尔

哦好的!谢谢 !
佩斯科(Pesko)'18

0

希望这个例子对您有帮助)

print(type(None) # NoneType

因此,您可以检查变量名称的类型

#Example
name = 12 # name = None
if type(name) != type(None):
    print(name)
else:
    print("Can't find name")
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.