在 Python 2.7 中检查字符串“None”或“not”

Posted

技术标签:

【中文标题】在 Python 2.7 中检查字符串“None”或“not”【英文标题】:Check string "None" or "not" in Python 2.7 【发布时间】:2016-06-27 09:48:39 【问题描述】:

想知道if not foo is None 是否与if foo 相同?使用 Python 2.7 和 foo 是一个字符串。

【问题讨论】:

@Signal:不,他们不是。 if foo is not None 只检查 foo 是否真的不是单例 Noneif foo 检查 if bool(foo)if foo.__nonzero__() 是完全不同的东西。 当字符串的len 大于0 时,bool(that_string) 返回True。如果字符串的len 为0,则返回False。我认为像 str 这样的内置函数没有 __nonzero__-method,但我不确定。 对不起,我把名字弄混了……这个方法叫做__bool__而不是__nonzero__ 我已经上传了我的测试,你可以看看这个gist。 每个不为空的变量(如空列表/set/dict/string/...)或 0(整数、浮点数、...)或简单的 FalseNone当用作 if variableif bool(variable) 时,计算结果为 True 【参考方案1】:

对于空字符串,两者都是不同的:

foo = ''
if foo:
    print 'if foo is True'

不会打印任何内容,因为它是,因此被视为False,但是:

if foo is not None: 
    print 'if not foo is None is True'

将打印,因为foo 不是无

我根据 PEP8 更改了它。 if foo is not None 等同于您的 if not foo is None,但更具可读性,因此被 PEP8 推荐。


更多关于 Python 的一般原则:

if a is None:
    pass

如果a = None 被明确设置,if 只会是True

另一方面:

if a:
    pass

当它是True时有几种评估方法:

    Python 尝试调用a.__bool__,如果实现了,则使用返回的值。

    所以NoneFalse0.00 将评估为False,因为它们的__bool__ 方法返回False

    如果a.__bool__ 没有实现,那么它会检查a.__len__.__bool__ 返回的内容。

    ''[]set()dict() 等将评估为 False,因为它们的 __len__ 方法返回 0。这是False,因为bool(0)False

    如果连a.__len__ 都没有实现,那么如果只返回True

    所以所有其他对象/函数/任何东西都只是True

另请参阅:您的 python 文档中的truth-value-testing。

【讨论】:

避免not X is Y,更喜欢X is not Y 感谢 MSeifert,在 Python 中,任何变量(可能是字符串对象和任何其他类型的对象)都应该指向某个对象,对吗?那if X is not None怎么会是假的呢? MSeifert,很好的答案。但是,如果定义了 __bool____len__,我们如何知道任何类? help(a) 显示有关该实例的所有信息,或者尝试print a.__bool__()print a.__len__()。 (或快捷方式bool(a)len(a)),看看是什么引发了错误(然后它没有实现)或者它是否打印了一些东西(然后它被实现了) 啊忘记了一个明显的情况:如果这两个方法都没有定义bool(a),则无论如何都返回True【参考方案2】:

不,当 foo 为空字符串时不一样。

In [1]: foo = ''

In [2]: if foo:
   ...:     print 1
   ...:

In [3]: if foo is None:
   ...:     print 2
   ...:

In [4]: if not foo is None:
   ...:     print 3
   ...:
3

【讨论】:

感谢天威,投赞成票。我经常看到人们写if not X(X 可以是任何类型的对象),如果在 Python 中一个变量必须指向某个对象,if not X 怎么可能是 False?谢谢。 @LinMa,当 X 既不是 None 也不是 empty(0,[], , () 或 '') 时,if not X 将为 False。【参考方案3】:

运营商is 比较id(你可以用id(something)检查某物的id)。因为None 只有一个实例,所以something is None 形式的任何表达式都将是FalseNone is Nonesomething == None 除外。运算符nothas less precedence than comparisons(而is 是一个比较运算符)所以not string is Nonenot (string is None) 相同的结果是总是True

不过,如果字符串对象不是空字符串,则将其视为True,如果是空字符串,则视为False

因此,其中一个表达式始终是 True,而另一个可以变化,所以不,它们不等价。

【讨论】:

感谢萨尔瓦,投票。我经常看到人们写if not X(X可以是任何类型的对象),如果在Python中一个变量必须指向某个对象,if not X怎么可能是False?谢谢。 还有萨尔瓦,对于not str is Nonenot 是在str 上运行,还是notstr is None 上运行?谢谢。 if not X 可以是False,因为在预期布尔值这样的 if 测试的上下文中,X 被隐式转换为布尔值。管理此类转换的规则在Python online reference 中进行了总结。 @LinMa,回答你的第二个问题我意识到答案推理失败。 not 的优先级低于比较,因此 not str is Nonenot (str is None) 相同。我编辑并修复了答案。【参考方案4】:

没有。试试这个代码

foo=''
if foo:
  print (1)
else:
  print (2)
if not foo is None:
  print (3)
else:
  print (4)

它会打印出来

2
3

【讨论】:

感谢 Sci,投票。在 Python 中,任何变量(可以是字符串对象和任何其他类型的对象)都应该指向某个东西,对吗?那if X is not None怎么会是假的呢?

以上是关于在 Python 2.7 中检查字符串“None”或“not”的主要内容,如果未能解决你的问题,请参考以下文章

需要使用过滤器从给定字符串中删除空格

Python 2.7 类型提示 PyCharm 中的可调用类型

Python 2.7,如何获取/检查列表的大小? [复制]

在 chrome 中自动打印/保存网页为 pdf - python 2.7

从用mypy注释的python函数返回None,多种返回类型

如何在 python 2.7 中验证字符串是有效的 UTF-8 字符串