网站建设业务的延伸性,wordpress头部工具栏,怎么用ftp备份网站,应用软件商店建议不是你不应该使用True#xff0c;False或None。这只是你不应该使用如果x True。
如果x True是愚蠢的#xff0c;因为只是一个二进制运算符#xff01;它的返回值为True或False#xff0c;取决于它的参数是否相等。如果条件为真#xff0c;则条件将继续。所以当你写如…建议不是你不应该使用TrueFalse或None。这只是你不应该使用如果x True。
如果x True是愚蠢的因为只是一个二进制运算符它的返回值为True或False取决于它的参数是否相等。如果条件为真则条件将继续。所以当你写如果x True Python将首先评估x True如果x是True和False否则将变为True然后继续如果结果是真的。但是如果你期望x是True或False为什么不直接使用x
同样x False通常可以由x替换。
在某些情况下你可能想使用x True。这是因为if语句条件是“在布尔上下文中评估”以查看它是否为“真实”而不是完全对照True。例如非空字符串列表和字典都被if语句视为真实的以及非零数字值但这些都不等于True。所以如果你想测试一个任意值是否正确的值True不只是它是否为真当你会使用如果x True。但我几乎从来没有看到一个用途。它是如此罕见如果你需要写这是值得添加一个评论所以未来的开发人员(包括可能自己)不只是假设 True是多余的并删除它。
使用x是真的而实际上更糟。你永远不应该使用基本的内置不可变类型如布尔值(TrueFalse)数字和字符串。原因是对于这些类型我们关心价值而不是身份。 测试这些类型的值是否相同而始终是测试标识。
测试标识而不是值是坏的因为一个实现可以理论上构造新的布尔值而不是去找到现有的值导致您有两个True值具有相同的值但存储在不同的内存中具有不同的身份。在实践中我很确定True和False总是被Python解释器重用所以这不会发生但这是一个实现细节。这个问题使人们一直使用字符串因为直接出现在程序源中的短字符串和字符串会被Python重用所以’foo’是’foo’总是返回True。但是很容易构造相同的字符串2种不同的方式并让Python给他们不同的身份。请注意以下事项stars1 .join(* for _ in xrange(100))stars2 * * 100stars1 is stars2
Falsestars1 stars2
True
编辑所以事实证明Python的平等布尔是一个有点意想不到的(至少对我)True is 1
FalseTrue 1
TrueTrue 2
FalseFalse is 0
FalseFalse 0
TrueFalse 0.0
True
正如the notes when bools were introduced in Python 2.3.5中解释的那样使用整数1和0来表示True和False的旧行为是好的但是我们只是想要更多描述性的名称用于表示真值的数字。
一种实现方法是在内置函数中只有True 1和False 0;那么1和True真的会无法区分(包括by)。但这也意味着一个函数返回True将在交互式解释器中显示为1因此所做的是将bool创建为int的子类型。唯一不同的是bool是str和repr; bool实例仍然具有与int实例相同的数据并且仍然以相同的方式比较等式所以True 1。
所以这是错误的使用x是True当x可能已经设置了一些代码希望“真是只是另一种方式拼写1”因为有很多方法来构造值等于True但没有相同的身份a 1Lb 1Lc 1d 1.0a True, b True, c True, d True
(True, True, True, True)a is b, a is c, a is d, c is d
(False, False, False, False)
并且使用x True是错误的当x可以是一个任意的Python值你只想知道它是否是布尔值True。我们唯一确定的是只是使用x是最好的当你只是想测试“诚实”。幸好这通常是所有必需的至少在我写的代码
一个更确定的方式是x True和type(x)是bool。但是对于一个很晦涩的情况这变得很冗长。它也不看起来非常Pythonic通过进行显式类型检查…但这真的是你在做什么当你试图精确测试True而不是真实;鸭式键入方式将接受真值并允许任何用户定义的类声明自己是真实的。
如果你处理这个非常精确的真理概念你不仅不认为非空集合是真的但也不认为1是真的那么只是使用x是True可能是好的因为大概那么你知道x没有来自认为1是真的代码。我不认为有任何纯python的方式来提出另一个True生活在一个不同的内存地址(虽然你可能从C做)所以这不应该打破尽管理论上是“错误的”事情去做。
我以前认为布尔人很简单
结束编辑
然而在None的情况下如果x是None则使用惯用法。在许多情况下你可以使用if不是x因为None对于if语句是一个“falsey”值。但是最好只有这样做如果你想要以相同的方式来处理所有falsey值(零值数值类型空集合和无)。如果你正在处理的值是一些可能的其他值或无表示“无值”(例如当一个函数返回None失败)那么更好的使用如果x是无这样你不会意外地假定函数失败当它刚刚发生返回一个空列表或数字0。
我使用而不是为不可变的值类型的参数建议你应该使用如果x 无而不是如果x是无。但是在无Python的情况下显式保证在整个Universe中只有一个None而正常的惯用Python代码使用的是。
关于是返回None还是引发异常它取决于上下文。
对于像get_attr这样的例子我希望它引发异常因为我要像do_something_with(get_attr(file))一样调用它。调用者的正常期望是他们将获得属性值并让他们获得无并假设属性值是一个更大的危险比忘记处理异常当你可以实际继续如果属性不能被发现。此外返回None以指示失败意味着None不是该属性的有效值。这在某些情况下可能是一个问题。
对于像see_if_matching_file_exists这样的虚函数我们提供了一个模式它检查几个地方看看是否有匹配如果找到一个匹配可以返回一个匹配如果没有匹配则返回None。但也可以返回一个匹配列表;那么没有匹配只是空列表(这也是“falsey”;这是其中一种情况我只是使用如果x看看是否有什么回来)。
因此当选择异常和无指示失败时必须确定None是否为预期的非失败值然后查看调用函数的代码的期望值。如果“正常”期望是将返回有效值并且只有偶尔会调用者能够正常工作无论是否返回有效值那么您应该使用异常来指示失败。如果没有有效的值会很常见因此调用者将期望处理这两种可能性那么您可以使用None。