在Python函数中使用True,False和None作为返回值

在Python函数中使用True,False和None作为返回值,第1张

在Python函数中使用True,False和None作为返回

该建议是不是说你不应该 使用

True
False
None
。只是您不应该使用
if x == True

if x == True
很愚蠢,因为
==
它只是二进制运算符!它的返回值是
True
False
,具体取决于其参数是否相等。
ifcondition
如果
condition
正确,将继续进行。因此,当您编写
if x == True
Python时,首先要进行评估
x ==True
True
如果
x
为was
True
False
否则为true,如果结果为true,则继续执行。但是,如果您期望
x
True
False
,为什么不直接使用
ifx

同样,

x == False
通常可以用代替
not x

在某些情况下,您可能需要使用

x ==True
。这是因为
if
语句条件是“在布尔上下文中求值”以查看其是否“真实”,而不是针对进行严格测试
True
。例如,if语句以及非零数字值都将非空字符串,列表和字典视为真,但都不等于
True
。因此,如果您想测试何时使用,则可以确定一个任意值是否
恰好是 该值
True
,而不仅是它是否真实
if x == True
。但是我几乎从来没有看到这种用法。非常罕见,如果您 确实
需要编写该注释,那么值得添加评论,以便将来的开发人员(包括您自己)不仅仅假设
== True
是多余的,将其删除。


使用

x isTrue
替代实际上更糟。你不应该使用
is
具有基本的内置不可变的类型,如布尔(
True
False
),数字和字符串。原因是对于这些类型,我们关心的是
价值 ,而不是 身份
==
测试这些类型的值是否相同,同时
is
始终测试身份。

测试身份而不是值是不好的,因为实现理论上可以构造新的布尔值而不是查找现有的值,从而导致您拥有两个

True
具有相同值的值,但是它们存储在内存中的不同位置并且具有不同的身份。实际上,我非常确定,
True
并且
False
Python解释器总是会重用它,因此不会发生这种情况,但这实际上是实现细节。这个问题使人们无时无刻不在使用字符串,因为直接出现在程序源中的短字符串和文字字符串被Python回收,因此
'foo'is 'foo'
始终会返回
True
。但是很容易以两种不同的方式构造相同的字符串,并让Python为它们提供不同的身份。请注意以下几点:

>>> stars1 = ''.join('*' for _ in xrange(100))>>> stars2 = '*' * 100>>> stars1 is stars2False>>> stars1 == stars2True

编辑: 因此,事实证明,Python对布尔值的相等性是有点意外(至少对我而言):

>>> True is 1False>>> True == 1True>>> True == 2False>>> False is 0False>>> False == 0True>>> False == 0.0True

正如在Python
2.3.5中引入布尔时的注释中所解释的那样,其基本原理是使用整数1和0表示True和False的旧行为是好的,但是我们只想为我们想要的数字提供更多描述性的名称代表真相值。

实现该目标的一种方法是简单地内置

True = 1
False = 0
内置。那么1和True确实是无法区分的(包括by
is
)。但这也意味着返回的函数
True
将显示
1
在交互式解释器中,因此要做的是将其创建
bool
为的子类型
int
。唯一不同的
bool
str
and
repr
;
bool
实例仍然具有与
int
实例相同的数据,并且仍以相同的方式比较相等性,因此
True == 1

因此,

x is True
x
某些代码可能期望“
True只是拼写1的另一种方式”设置了代码时,使用这种方法是错误的,因为有很多方法可以构造与它相等
True
但不相同的值:

>>> a = 1L>>> b = 1L>>> c = 1>>> d = 1.0>>> a == 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
当when
x
可以是任意Python值并且只想知道它是否为Boolean值时,使用错误
True
。我们唯一可以确定的是,
x
当您只想测试“真实性”时,仅使用最佳方法。值得庆幸的是,通常至少在我编写的代码中这就是全部!

更确定的方法是

x == True and type(x) isbool
。但是对于一个晦涩难懂的案例来说,这变得非常冗长。通过执行显式类型检查,它看起来也不是Python风格的……但这确实是您在尝试精确测试
True
而不是真实测试时所要做的。鸭子的输入方式是接受真实值,并允许任何用户定义的类将自己声明为真实。

如果您要处理非常精确的真理概念,那么您不仅不认为非空集合为真,而且不认为1为真,那么使用

x isTrue
就可以了,因为大概您就知道那
x
不是来自那个认为1是真实的代码。我不认为有任何一种纯Python的方式可以提出另一个
True
位于不同内存地址的方式(尽管您可以从C中做到这一点),所以尽管从理论上讲这是“错误的”事情,但它永远都不会中断做。

我以前认为布尔值很简单!

结束编辑


在的情况下

None
,然而,这个成语是使用
if x is None
。在许多情况下,可以使用
if notx
,因为它
None
if
语句的“假”值。但是最好仅在要以
None
相同方式对待所有假值(零值数字类型,空集合和)的情况下执行此 *** 作。如果你面对的要么是一些其他可能的值或值
None
表示“没有价值”(如函数返回时
None
失败),那么它的
很多 更好地使用
if x is None
,这样你就不会意外承担函数失败时它刚好会返回一个空列表或数字0。

我关于使用

==
而不是
is
不可变值类型的论点建议您应该使用
if x == None
而不是
if x isNone
。但是,就
None
Python而言,它确实明确保证
None
了整个宇宙中只有一个,并且常规惯用的Python代码使用
is


关于返回

None
还是引发异常,取决于上下文。

对于您的

get_attr
示例,我希望它会引发异常,因为我将称呼为like
do_something_with(get_attr(file))
。调用者的通常期望是,他们将获得属性值,并且让他们获得
None
并假定该属性值是一个危险的危险,而不是忘记处理异常(如果您无法继续该属性而实际上可以继续),那么危险就更大了。找到了。另外,返回
None
指示失败意味着
None
该属性无效。在某些情况下这可能是个问题。

对于像的虚函数

see_if_matching_file_exists
,我们提供了一个模式,并检查几个位置以查看是否存在匹配项,如果找到一个匹配项,或者找不到匹配项,则可能返回匹配项
None
。但是,它也可以返回匹配列表。那么没有匹配项就是空列表(它也是“
falsey”;这是我只是
if x
用来查看是否收到任何东西的情况之一)。

因此,当在异常之间进行选择并

None
指示失败时,必须确定是否
None
为期望的非失败值,然后查看调用该函数的代码的期望。如果“正常”的期望是将返回一个有效值,并且无论是否返回一个有效值,调用者仅偶尔能够正常工作,那么您应该使用异常来指示失败。如果没有有效值是很常见的,那么调用者将期望同时处理这两种可能性,那么您可以使用
None



欢迎分享,转载请注明来源:内存溢出

原文地址: http://outofmemory.cn/zaji/5652430.html

(0)
打赏 微信扫一扫 微信扫一扫 支付宝扫一扫 支付宝扫一扫
上一篇 2022-12-16
下一篇 2022-12-16

发表评论

登录后才能评论

评论列表(0条)

保存