【问题标题】:Can the Python bool() function raise an exception for an invalid argument?Python bool() 函数能否为无效参数引发异常?
【发布时间】:2018-10-17 19:45:33
【问题描述】:

如果无法将参数转换为适当的数字类型,int()float() 等函数可能会引发异常 (ValueError)。因此,如果有可能将无效参数传递给它们,则将它们包含在 try-except 中通常是一种好习惯。

但由于 Python 在“真实性”方面的灵活性,我想不出任何可能传递给 bool() 函数的值会引发异常。即使您完全不带参数调用它,该函数也会完成并返回False

我是否正确bool() 不会引发异常,只要您传递的参数不超过一个?因此,将调用包含在 try-except 中毫无意义?

【问题讨论】:

    标签: python exception-handling boolean


    【解决方案1】:

    __bool__ 不返回TrueFalse 时,bool 会抱怨。

    >>> class BoolFail:
    ...     def __bool__(self):
    ...         return 'bogus'
    ... 
    >>> bool(BoolFail())
    [...]
    TypeError: __bool__ should return bool, returned str
    

    不过,没有任何内置类型如此疯狂。

    DSM 发表了非常有价值的评论:流行的 库中有bool 会产生错误的示例。

    >>> import numpy as np
    >>> a = np.array([[1],[2]])
    >>> bool(a)
    [...]
    ValueError: The truth value of an array with more than one element is ambiguous. Use a.any() or a.all()
    

    user2357112 指出了以下极端情况。

    标准的、近乎通用的 stdlib 示例,例如:一个死对象的weakref.proxy 将引发几乎所有操作的ReferenceError,包括bool

    >>> import weakref
    >>> class Foo:
    ...     pass
    ... 
    >>> bool(weakref.proxy(Foo()))
    [...]
    ReferenceError: weakly-referenced object no longer exists
    

    这不是bool 独有的,任何使用其死参数的函数都可能抛出此错误,例如myfunc = lambda x: print(x)

    【讨论】:

    • 或者可以显式设计一个类型,使其无法转换为bool,从而在__bool__() 中引发异常。
    • @kindall 当然。不过,我想不出标准库中的任何示例。
    • 虽然不是 stdlib,但 numpy 数组是一个很好的真实世界常用对象示例,通常在 bool 调用时引发 ValueErrors。
    • @DSM,有趣且有用的一点,因为普通的list 类型将评估True,只要它不为空。
    • 标准的、近乎通用的 stdlib 示例,例如:一个死对象的weakref.proxy 将引发几乎所有操作的ReferenceError,including bool
    猜你喜欢
    • 2012-02-20
    • 2019-12-07
    • 2017-05-16
    • 2013-09-16
    • 1970-01-01
    • 2010-09-12
    • 1970-01-01
    相关资源
    最近更新 更多