Python bool()函数可以为无效参数引发异常吗?

JDM*_*JDM 7 python boolean exception-handling

有可能为类似功能int()float()引发异常(ValueError)如果参数不能被转换为适当的数字类型.因此,try-except如果有可能将无效的参数传递给它们,通常将这些包含在a中是一种好的做法.

但是,当涉及到"真实性"时,Python的灵活性,我无法想到你可能传递给bool()会引发异常的函数的任何可能的值.即使你完全没有参数调用它,该函数也会完成并返回False.

我是否正确,bool()只要你传递的不超过一个参数,就不会引发异常?结果,将呼叫包含在一个try-except?中是没有意义的?

tim*_*geb 12

bool抱怨什么__bool__时候不回来TrueFalse.

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

但是,没有内置类型这种疯狂.

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()
Run Code Online (Sandbox Code Playgroud)

user2357112指出了以下角落案例.

标准的,近乎通用的stdlib示例,对于这样的事情:对死对象的weakref.proxy将引发几乎所有操作的ReferenceError,包括bool.

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

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

  • 虽然不是stdlib,但是numpy数组是常用对象的一个​​很好的真实示例,它经常在bool调用中引发ValueErrors. (3认同)
  • 标准的,几乎通用的stdlib示例,例如:死对象的weakref.proxy将对几乎所有操作(包括[bool]](https://ideone.com/H8lP7L)都引发ReferenceError。 (2认同)