【发布时间】:2014-05-29 23:09:21
【问题描述】:
我有一个有时会返回 NoneType 值的方法。那么我怎么能质疑一个 NoneType 的变量呢?我需要使用 if 方法,例如
if not new:
new = '#'
我知道那是错误的方式,我希望你明白我的意思。
【问题讨论】:
我有一个有时会返回 NoneType 值的方法。那么我怎么能质疑一个 NoneType 的变量呢?我需要使用 if 方法,例如
if not new:
new = '#'
我知道那是错误的方式,我希望你明白我的意思。
【问题讨论】:
那么我该如何质疑一个 NoneType 的变量呢?
使用is 运算符,像这样
if variable is None:
为什么会这样?
由于None是Python中NoneType的唯一单例对象,我们可以使用is运算符来检查变量中是否包含None。
引用is docs,
运算符
is和is not测试对象身份:当且仅当x和y是同一个对象时,x is y为真。x is not y产生逆真值。
由于None 只能有一个实例,is 将是检查None 的首选方式。
从马口中听到
引用Python's Coding Style Guidelines - PEP-008(Guido 本人共同定义),
与
None等单例的比较应始终使用is或is not,永远不要使用相等运算符。
【讨论】:
== None和is None有什么区别?
None,它们都会产生相似的结果。
pandas DataFrame 是否存在,这不起作用——为此,我使用 type(df) is type(None) 来避免:The truth value of a DataFrame is ambiguous
isinstance(instance, type(None)) 应添加以使其成为完整的答案。有边缘情况。例如,如果您正在构建一个动态类型的元组进行验证,并且验证器正在使用 isinstance(它接受一个元组)。
if variable is None:
...
if variable is not None:
...
【讨论】:
也可以按照Alex Hall's answer 使用isinstance 来完成:
>>> NoneType = type(None)
>>> x = None
>>> type(x) == NoneType
True
>>> isinstance(x, NoneType)
True
isinstance 也很直观,但复杂的是它需要一行
NoneType = type(None)
int 和 float 等类型不需要。
【讨论】:
NoneType 并且由于 None 是单例,因此不应使用 isinstance 来检测 None - 相反,您应该按照公认的答案进行操作,并且使用is None 或is not None。
isinstance(它需要一个列表)。
正如 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
其他信息
您还可以在documentation 中提到的一个isinstance() 语句中检查多种类型。只需将类型写为元组即可。
isinstance(x, (type(None), bytes))
【讨论】:
NoneType 并且由于 None 是单例,因此不应使用 isinstance 来检测 None - 相反,您应该按照公认的答案进行操作,并且使用is None 或is not None。
isinstance不应该被使用?我知道应该首选is,但在某些情况下,isinstance 表单感觉更自然(比如一次检查多种类型isinstance(x, (str, bool, int, type(None))))。这只是个人喜好还是有我不知道的警告?
type 2. 然后调用它 3. 然后查找 None 的类型 - 当 None 都是单例时和一个关键字。另一个缺点: 4. 这是非常不标准的,当人们查看您的代码时会引起注意。 x is None 是更优化的检查。我建议x is None or isinstance(x, (str, bool, int)) - 但我也建议你在对没有太多共同点的类型进行那种类型检查时多想想你在做什么......
不确定这是否能回答问题。但我知道这花了我一段时间才弄清楚。我正在浏览一个网站,突然之间不再有作者的名字了。所以需要一个检查语句。
if type(author) == type(None):
print("my if body")
else:
print(" my else body")
在这种情况下,作者可以是任何变量,None 可以是您要检查的任何类型。
【讨论】:
None 是一个单例,type 不应该用于检测None - 相反,您应该按照公认的答案进行操作,并使用is None 或is not None。
my else body?!
Python 2.7:
x = None
isinstance(x, type(None))
或
isinstance(None, type(None))
==> 是的
【讨论】:
NoneType 并且由于 None 是单例,因此不应使用 isinstance 来检测 None - 相反,您应该按照公认的答案进行操作,并且使用is None 或is not None。
希望这个例子对你有所帮助)
print(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: ...