使用bool作为整体是Pythonic吗?

时间:2010-07-04 10:43:13

标签: boolean python

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

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

bool_to_str(True)

请注意值bool,但用作int

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

7 个答案:

答案 0 :(得分:159)

我将是一个奇怪的声音(因为所有答案都在谴责使用False == 0True == 1作为语言保证的事实,因为我声称使用这个事实来简化您的代码完全没问题。

从历史上看,逻辑真/假操作往往只使用0表示false,1表示true;在Python 2.2生命周期的过程中,Guido注意到有太多模块开始使用false = 0; true = 1这样的赋值,这就产生了样板和无用的变化(后者是因为真假的大写都到处都是 - 一些使用了全部大写,一些全小写,一些大写的首字母)因此引入了bool的{​​{1}}子类及其intTrue常量。 / p>

由于我们很多人担心Python新手会使用新的类型和常量来限制语言的能力,因此当时有一些阻力,但Guido坚持认为我们只是存在悲观:例如,没有人能够如此严格地理解Python,以避免将FalseFalse完全自然地用作列表索引,或者求和,或其他如此完全清晰且有用的习语。

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

与这种误解的趋势作斗争,我敦促每个人使用Python作为Python 试图强迫它进入其功能和首选风格的其他语言的模式是完全不同的。 在Python 中,True和False为99.9%,如1和0,在True(从而str(...))形式中完全 < - > 除字符串化之外的每个其他操作,只需随意使用它们而不会扭曲。这适用于索引,算术,位操作等等。

答案 1 :(得分:143)

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

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

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

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

答案 2 :(得分:37)

确实

def bool_to_str(value):
    "value should be a bool"
    return 'Yes' if value else 'No'

更具可读性。

答案 3 :(得分:13)

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

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

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

def bool_to_str(value):
    """value should be a bool"""
    return "Yes" if value else "No"

答案 4 :(得分:5)

实际上,该语言的一个特性是False == 0和True == 1(它不依赖于实现):Is False == 0 and True == 1 in Python an implementation detail or is it guaranteed by the language?

但是,我同意大多数其他答案:通过使用['No', 'Yes'][value]或字典来获得与… if value else …相同的结果有更多可读方式提示和声明value是布尔值的各自优点。

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

答案 5 :(得分:1)

使用bool作为int是完全正常的,因为bool是int的子类。

>>> isinstance(True, int)
True
>>> isinstance(False, int)
True

关于你的代码:将它放在像这样的单行函数中。读者需要找到你的函数源或文档并阅读它(函数的名称并没有告诉你太多)。这会中断流程。只需将其内联并且不使用列表(在运行时构建),使用元组(如果值是常量,则在编译时构建)。例如:

print foo, bar, num_things, ("OK", "Too many!)[num_things > max_things]

答案 6 :(得分:0)

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

  1. 只需使用布尔值作为条件语句即可。人们一直这样做。

    a = 0
    if a:
        do something
    
  2. 但是,如果您想要计算有多少项成功,那么代码可能对其他人来说不太友好。

    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)
    
  3. 但我确实看到生产代码看起来像这样。

    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])