【问题标题】:Where does the current documentation specify that [5] is true?当前文档在哪里指定 [5] 是正确的?
【发布时间】:2020-08-21 00:07:18
【问题描述】:

背景:我要回答this question,以“documentation 指定非空列表为真且 [...]”之类的内容开头。但后来我意识到它不再指定了。至少不是很明显,它曾经如此。

直到 Python 3.5,文档 still said(强调我的):

4.1。真值测试

可以测试任何对象的真值,用于 if 或 while 条件或作为以下布尔运算的操作数。以下 值被认为是错误的:

  • None
  • False
  • 任何数字类型的零,例如,00.00j
  • 任何空序列,例如,''()[]
  • 任何空映射,例如{}
  • 用户定义类的实例,如果该类定义了__bool__()__len__() 方法,则当该方法返回整数零或boolFalse。 [1]

所有其他值都被认为是真——因此许多类型的对象总是真。

除非另有说明,否则具有布尔结果的操作和内置函数始终返回 0False 为假,1True 为真。 (重要的例外:布尔运算 orand 总是返回它们的操作数之一。)

[5] 这样的非空列表不属于上述列表中的任何内容,因此“所有其他”指定它为真。

但是从 Python 3.6 开始,这已经不复存在了。那段now says

真值测试

可以测试任何对象的真值,用于ifwhile 条件或作为以下布尔运算的操作数。

默认情况下,一个对象被认为是真的,除非它的类定义 返回False__bool__() 方法或__len__() 方法 使用对象调用时返回零。 [1] 这里是大部分 内置对象被认为是错误的:

  • 定义为假的常量:NoneFalse
  • 任何数字类型的零:00.00jDecimal(0)Fraction(0, 1)
  • 空序列和集合:''()[]{}set()range(0)

除非另有说明,否则具有布尔结果的操作和内置函数始终返回 0False 为 false,1True 为 true。 (重要的例外:布尔运算 orand 总是返回它们的操作数之一。)

现在[5] 可以有一个返回False__bool__() 方法,因此它是错误的。当前文档中是否有新的地方以某种方式指定非空列表为真?

【问题讨论】:

标签: python


【解决方案1】:

所有内置类的文档列出了它们实现的所有特殊方法。如果一个方法没有被列出,你可以假设它没有被实现。

由于list 的文档没有说明重写__bool__ 方法,它继承了默认行为。

要查找所有list 操作,请启动here。但是,它还指出列表实现了所有 commonmutable 序列操作,因此您需要阅读该文档以获取完整列表。

【讨论】:

  • 能否给list的特殊方法的文档链接?
  • 我已经用文档链接更新了答案。
  • 我明天再仔细看看。乍一看,您的“这里”链接只命名了sort 方法,而其他两个地方谈论的是操作而不是方法。例如,他们都没有提到__len__ 方法。即使list.__len__ 确实存在。
  • 通用序列文档中提到了len()__len__ 是用于实现它的低级方法。
  • 也许这是一个论点。明天我会考虑的。但在这一点上,我们已经远离了一些我可以指出的显而易见的事情。看看我在问题中添加的第一段,关于背景。
【解决方案2】:

刚刚找到一个地方,in the reference(强调我的):

6.11。布尔运算

[...]

在布尔运算的上下文中,以及当表达式是 由控制流语句使用,以下值被解释 为假:FalseNone、所有类型的数字零和空字符串 和容器(包括字符串、元组、列表、字典、集合 和冻结集)。 所有其他值都被解释为 true。 用户定义的对象可以通过提供一个 __bool__() 方法。

这让我有点困扰,这句话马上就与下一句关于用户定义的对象相矛盾,但我会接受的。

【讨论】:

    【解决方案3】:

    [5] 是一个 list 对象。除非您专门覆盖了内置的 __bool__ 方法,否则您将获得默认方法。正如文档已经暗示的那样,这是Truthy

    这次更新并没有改变太多,只是扩大了解释以涵盖派生类型和内置类型的其他扩充。

    【讨论】:

    • 我得到了默认方法?我刚刚测试过,list.__bool__ 不存在。我会说如果不知道,那么文档的普通读者也不知道。因此,缺少一些东西。
    • 好镜头:__bool__ 方法继承自父类。但是,这并不能否定您的观点:普通读者不会知道。但是,我觉得普通读者会理解文档的预期含义:默认情况下,示例语义就是您所得到的。如果你认为[5] 应该是 Falsey,那么你需要采取具体的行动来做到这一点。
    • 嗯,[5].__bool__ 也不存在。不应该是遗传吗?或者你的意思是什么?
    • 你将成为一名优秀的调查程序员(或者你可能已经是其中之一)! [5] 是内置类型中的常量;符号的工作方式不同。这不是离题的时间或地点......我很乐意看到你将你的挖掘尝试作为一个单独的问题发布!
    • 很抱歉一直“离题”,但你的意思是,符号的工作方式不同?我如何看到继承的__bool__ 方法?
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2010-09-10
    • 2019-03-07
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多