用bools作为整数是Pythonic吗?
False
等于0
, True
等于1
所以可以这样做:
def bool_to_str(value): """value should be a bool""" return ['No', 'Yes'][value] bool_to_str(True)
注意值是bool
但用作int
。
这是Pythonic的这种使用还是应该避免?
我会成为一个奇怪的声音(因为所有的答案是谴责False == 0
和True == 1
,因为语言保证),因为我声称使用这个事实来简化你的代码是完美的精细。
从历史上看,逻辑真/假操作倾向于简单地使用0
代表假, 1
代表真。 在Python 2.2的生命周期过程中,Guido注意到太多的模块开始于赋值,例如false = 0; true = 1
false = 0; true = 1
,这产生了样板和无用的变化(后者是因为真假的大写是遍布的地方 – 一些使用全部大写,一些全小写,一些上限),所以引入了bool
子类int
和它的True
和False
常量。
当时有一些推迟,因为我们很多人担心Python新手会使用新的types和常量来限制语言的能力,但是Guido坚持认为我们只是悲观的:没有人会理解Python,例如,以避免完全自然地使用False
和True
作为列表索引,或者总结或其他这样的完全清楚和有用的习语。
这个线程的答案certificate我们是正确的:正如我们担心的那样,对这种types和常量的angular色的误解已经出现了,人们正在避免,而且更糟糕的是,促使其他人避免完全自然的Python构造,无用的回转。
为了抵御这种误解,我鼓励大家把Python当作Python来使用 , 而不是强迫它进入其他语言的模式,这些语言的function和偏好风格是完全不同的。 在Python中 ,True和False是99.9%,像1和0,在str(...)
(和repr(...)
)forms上完全不同 – 对于除了stringify之外的其他操作,只要随意使用它们没有扭曲。 这适用于索引,算术,位操作等等等等。
我和Alex在一起。 False==0
和True==1
,并没有什么错。
不过,在Python 2.5和更高版本中,我会使用Python的条件expression式来写出这个特定问题的答案:
def bool_to_str(value): return 'Yes' if value else 'No'
这种方式没有要求参数实际上是一个布尔 – 就像if x: ...
接受任何types的x
, bool_to_str()
函数应该做正确的事情,当它传递None,一个string,一个列表,或3.14。
一定:
def bool_to_str(value): "value should be a bool" return 'Yes' if value else 'No'
更具可读性。
您的代码在某些情况下似乎不准确:
>>> def bool_to_str(value): ... """value should be a bool""" ... return ['No', 'Yes'][value] ... >>> bool_to_str(-2) 'No'
我build议你只使用条件运算符来提高可读性:
def bool_to_str(value): """value should be a bool""" return "Yes" if value else "No"
它实际上是False == 0和True == 1(不依赖于实现)的语言特性: Python中的False == 0和True == 1是实现细节,还是由语言保证?
然而,我同意大部分其他答案:通过使用… if value else …
或dictionary来获得与['No', 'Yes'][value]
相同结果的可读方式,它们分别具有提示和说明value
是一个布尔value
优点。
另外, … if value else …
遵循通常的约定,即非0为真:即使在value == -2
(值为真)的情况下也如此,正如大丽花所暗示的那样。 列表和字典的方法是不健壮的,在这种情况下,所以我不会推荐他们。
使用bool作为int是非常好的,因为bool是int的子类。
>>> isinstance(True, int) True >>> isinstance(False, int) True
关于你的代码:把它放在一个这样的单行函数中, 读者需要find你的函数源或文档并阅读它(函数的名称不会告诉你很多)。 这会中断stream程。 只要把它内联,不要使用列表(在运行时build立),使用一个元组(在编译时build立,如果值是常量)。 例:
print foo, bar, num_things, ("OK", "Too many!)[num_things > max_things]
我个人认为这取决于你如何使用这个事实,这里有两个例子
-
只要简单地使用布尔作为条件语句是好的。 人们总是这样做。
a = 0 if a: do something
-
但是,如果你想要统计有多less项目成功了,那么代码可能对其他人来说不是很友好。
def succeed(val): if do_something(val): return True else: return False count = 0 values = [some values to process] for val in values: count += succeed(val)
但是我确实看到生产代码是这样的。
all_successful = all([succeed(val) for val in values]) at_least_one_successful = any([succeed(val) for val in values]) total_number_of_successful = sum([succeed(val) for val in values])