如何在python中"测试"NoneType?

Crv*_*iZg 348 python nonetype

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

if not new:
    new = '#'
Run Code Online (Sandbox Code Playgroud)

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

the*_*eye 545

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

is像这样使用运算符

if variable is None:
Run Code Online (Sandbox Code Playgroud)

为什么会这样?

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

引用is文档,

对象标识的运算符isis not测试:x is y当且仅当xy是同一个对象时才是真的.x is not y产生反向真值.

由于只能有一个实例None,is因此是首选检查方式None.


从马的嘴里听到它

引用Python的编码风格指南 - PEP-008(由Guido自己共同定义),

比较像单身人士None应始终做到is或者is not,从来没有平等的运营商.

  • 如果比较“pandas”数据帧是否存在,这不起作用——为此,我使用“type(df) is type(None)”来避免:“数据帧的真值不明确” (4认同)
  • 应添加“isinstance(instance, type(None))”以使其成为完整的答案。有一些边缘情况。例如,如果您正在构建用于验证的动态类型元组,并且验证器正在使用 isinstance(它采用元组)。 (4认同)
  • 那么`== None`和`is None`有什么区别呢? (3认同)

car*_*mom 19

isinstance根据Alex Hall的回答,它也可以完成:

>>> NoneType = type(None)
>>> x = None
>>> type(x) == NoneType
True
>>> isinstance(x, NoneType)
True
Run Code Online (Sandbox Code Playgroud)

isinstance 也是直观的,但它需要线路的复杂性

NoneType = type(None)

对于像int和的类型不需要float.

  • 由于您无法子类化 `NoneType` 并且 `None` 是单例,因此不应使用 `isinstance` 来检测 `None` - 相反,您应该按照接受的答案进行操作,并使用 `is None` 或 `is不是无`。 (3认同)
  • 有一些边缘情况。例如,如果您正在构建用于验证的动态类型列表,并且验证器正在使用“isinstance”(它采用一个列表)。 (2认同)
  • 另外,“assert isinstance(x, str) or x is None”不会导致“x”被推断为“str |”。Pyright 的 None`,但 `assert isinstance(x, (str, type(None)))` 会。 (2认同)

Mar*_*sli 14

正如Aaron Hill的命令所指出的那样:

因为你不能进行子类化NoneType,因为它None是一个单例,isinstance不应该被用来检测None- 相反,你应该按照接受的答案说,并使用is Noneis not None.


原答案:

然而,最简单的方法是,除了小豆蔻的答案之外没有额外的线路可能是:
isinstance(x, type(None))

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

使用isinstance()不需要isif-statement中:

if isinstance(x, type(None)): 
    #do stuff
Run Code Online (Sandbox Code Playgroud)

附加信息
您还可以isinstance()文档中提到的一个语句中检查多种类型.只需将类型写为元组即可.

isinstance(x, (type(None), bytes))
Run Code Online (Sandbox Code Playgroud)

  • 由于您不能对 `NoneType` 进行子类化,并且因为 `None` 是一个单例,所以不应使用 `isinstance` 来检测 `None` - 相反,你应该按照公认的答案进行操作,并使用 `is None` 或 `is不是无`。 (2认同)
  • @AaronHall 为什么**不**使用`isinstance`?我知道应该首选“is”,但在某些情况下,isinstance 形式感觉更自然(例如一次检查多个类型“isinstance(x, (str, bool, int, type(None)))”) 。这只是个人喜好还是有我不知道的警告? (2认同)
  • @Conchylicultor 您的建议的缺点: 1. 全局查找“type” 2. 然后调用它 3. 然后查找“None”的类型 - 当“None”既是单例又是关键字时。另一个缺点:4.这是非常不标准的,当人们查看你的代码时会引起人们的注意。`x is None` 是一个更优化的检查。我建议 `x is None 或 isinstance(x, (str, bool, int))` - 但我也建议您在对不存在的类型进行类型检查时更多地考虑您在做什么没有太多共同点... (2认同)

小智 7

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

if type(author) == type(None):
      print("my if body")
else:
     print(" my else body")
Run Code Online (Sandbox Code Playgroud)

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

  • 由于“None”是单例,因此不应使用“type”来检测“None” - 相反,您应该按照接受的答案进行操作,并使用“is None”或“is not None”。 (2认同)