用bools作为整数是Pythonic吗?

False等于0True等于1所以可以这样做:

 def bool_to_str(value): """value should be a bool""" return ['No', 'Yes'][value] bool_to_str(True) 

注意值是bool但用作int

这是Pythonic的这种使用还是应该避免?

我会成为一个奇怪的声音(因为所有的答案是谴责False == 0True == 1 ,因为语言保证),因为我声称使用这个事实来简化你的代码是完美的精细。

从历史上看,逻辑真/假操作倾向于简单地使用0代表假, 1代表真。 在Python 2.2的生命周期过程中,Guido注意到太多的模块开始于赋值,例如false = 0; true = 1 false = 0; true = 1 ,这产生了样板和无用的变化(后者是因为真假的大写是遍布的地方 – 一些使用全部大写,一些全小写,一些上限),所以引入了bool子类int和它的TrueFalse常量。

当时有一些推迟,因为我们很多人担心Python新手会使用新的types和常量来限制语言的能力,但是Guido坚持认为我们只是悲观的:没有人会理解Python,例如,以避免完全自然地使用FalseTrue作为列表索引,或者总结或其他这样的完全清楚和有用的习语。

这个线程的答案certificate我们是正确的:正如我们担心的那样,对这种types和常量的angular色的误解已经出现了,人们正在避免,而且更糟糕的是,促使其他人避免完全自然的Python构造,无用的回转。

为了抵御这种误解,我鼓励大家把Python当作Python使用而不是强迫它进入其他语言的模式,这些语言的function和偏好风格是完全不同的。 在Python中 ,True和False是99.9%,像1和0,在str(...) (和repr(...) )forms上完全不同 – 对于除了stringify之外的其他操作,只要随意使用它们没有扭曲。 这适用于索引,算术,位操作等等等等。

我和Alex在一起。 False==0True==1 ,并没有什么错。

不过,在Python 2.5和更高版本中,我会使用Python的条件expression式来写出这个特定问题的答案:

 def bool_to_str(value): return 'Yes' if value else 'No' 

这种方式没有要求参数实际上是一个布尔 – 就像if x: ...接受任何types的xbool_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] 

我个人认为这取决于你如何使用这个事实,这里有两个例子

  1. 只要简单地使用布尔作为条件语句是好的。 人们总是这样做。

     a = 0 if a: do something 
  2. 但是,如果你想要统计有多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])