使用bool作为整体是Pythonic吗?

hwi*_*ers 66 python boolean

False相当于0并且True是等价的,1因此可以做这样的事情:

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

bool_to_str(True)
Run Code Online (Sandbox Code Playgroud)

请注意值是如何bool但是用作int.

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

Ale*_*lli 163

我将是一个奇怪的声音(因为所有的答案都在谴责使用事实,False == 0并且True == 1,正如语言所保证的那样)因为我声称使用这个事实来简化你的代码是完全没问题的.

从历史上看,逻辑真/假操作倾向于简单地0用于虚假和1真实; 在Python 2.2的生命周期过程中,Guido注意到有太多的模块开始使用诸如此类的分配,false = 0; true = 1并且这产生了样板和无用的变化(后者因为真假的大写到处都是 - 有些全部使用了-caps,一些全小写,一些cap-initial)因此引入了bool子类int及其TrueFalse常量.

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

这个帖子的答案证明我们是正确的:正如我们所担心的那样,对这种类型和常数的角色的完全误解已经出现,人们正在避免,更糟糕的是,敦促其他人避免,完全自然的Python构造支持无用的回转.

与这种误解的趋势作斗争,我敦促每个人都使用Python作为Python,而不是试图强迫它进入其功能和首选风格完全不同的其他语言的模式. 在Python,真假像1和0 99.9%,不同的仅仅在他们str(...)(从而repr(...))形式-为每一个不同的字串其他操作,只需随意使用,而不必扭曲.这适用于索引,算术,位操作等等.

  • "例如,没有人会理解Python如此糟糕,以避免完全自然地使用False和True作为列表索引".我当然不反对以这种方式使用它们,但我绝不认为人们使用布尔类型索引到列表是"自然的",除非他们碰巧知道`bool`子类`int` (22认同)
  • +1与Ruby对比,强制`val?1:0`和类似的体操垃圾,如果你需要将bool视为int. (9认同)
  • 有趣的历史课确实!但是,我认为事实上大多数人都会区分布尔和整数(我确实......).在某种程度上,人们正在定义"使用Python作为Python"意味着什么:我们大多数人确实认为两种类型之间存在逻辑上的区别(数学大多数也是如此:逻辑不需要算术).我很高兴Python允许我们这样思考. (3认同)
  • 我不敢相信我不同意亚历克斯的观点,但我确实同意。在这种情况下使用布尔值作为索引可以避免鸭子类型,而“'True' if value else 'False'``适用于任何真实的“value”。 (2认同)

Gui*_*sum 145

我和Alex在一起.False==0而且True==1,这并没有错.

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

def bool_to_str(value):
  return 'Yes' if value else 'No'
Run Code Online (Sandbox Code Playgroud)

这样就没有要求参数实际上是一个bool - 就像if x: ...接受任何类型一样x,bool_to_str()函数应该在传递None,字符串,列表或3.14时做正确的事情.


Sil*_*ost 37

一定:

def bool_to_str(value):
    "value should be a bool"
    return 'Yes' if value else 'No'
Run Code Online (Sandbox Code Playgroud)

更具可读性.

  • 我会争论那个......是的,使用`x if foo else y` thingy更加pythonic,但我仍然认为它看起来很丑陋并经常膨胀代码.我认为问题**中的代码看起来更清晰,对于那些不知道隐式bool到int转换的人来说可能会让人感到困惑,但是`x if foo else y`对于来自的人来说同样令人困惑`foo?x:y`世界的事物.即使我不得不承认,对于正在学习他们的第一语言的人来说,`x if foo else y`可能是最清楚的. (2认同)
  • @Ivo,+1,因为我同意这个实质,但我不同意"三元"构造(中间的条件,而不是像C中的开头那样)对新手来说特别自然或明显(这是邪恶中最少的)在许多情况下 - 这是另一回事;-). (2认同)

min*_*hee 13

在某些情况下,您的代码似乎不准确:

>>> def bool_to_str(value):
...     """value should be a bool"""
...     return ['No', 'Yes'][value]
...
>>> bool_to_str(-2)
'No'
Run Code Online (Sandbox Code Playgroud)

我建议你只使用条件运算符来提高可读性:

def bool_to_str(value):
    """value should be a bool"""
    return "Yes" if value else "No"
Run Code Online (Sandbox Code Playgroud)

  • 函数的名称是`bool_to_str`,doc注释`value应该是bool`,当你传递它时,你会惊讶于它给出了错误的答案`-2` :) (15认同)
  • +1虽然我同意Alex Martelli的答案,但在这种情况下,似乎"更多Pythonic"可以利用`... if ... else ...`提供的隐式转换为`bool`.然后该功能适用​​于bools和其他任何东西.虽然也许不是最好的例子,因为我不同意使用bool作为整体的想法. (3认同)

Eri*_*got 5

它实际上是False == 0和True == 1的语言特征(它不依赖于实现):Python中的False == 0和True == 1是一个实现细节,还是由语言保证的?

但是,我确实同意其他大多数答案:['No', 'Yes'][value]通过使用… if value else …或者使用字典来获得相同结果有更多可读方式,这些方法具有提示和陈述的相应优点,这value是一个布尔值.

另外,… if value else …遵循通常的惯例,即非0是真的:即使在value == -2(值为True)时它也可以工作,如dahlia暗示的那样.在这种情况下,列表和字典方法不那么强大,所以我不推荐它们.