¿Puede la función bool () de Python generar una excepción para un argumento no válido?

Es posible que funciones como int() o float() ValueError una excepción ( ValueError ) si el argumento no se puede convertir al tipo numérico apropiado. Por lo tanto, generalmente es una buena práctica incluirlos en un try-except si existe la posibilidad de que se les pase un argumento no válido.

Pero con la flexibilidad de Python cuando se trata de “veracidad”, no puedo pensar en ningún valor posible que pueda pasar a la función bool() que generaría una excepción. Incluso si lo llama sin ningún argumento, la función se completa y devuelve False .

¿Estoy bool() que bool() no generará una excepción, siempre que no pases más de un argumento? ¿Y como resultado, no tiene sentido encerrar la llamada en un try-except ?

bool queja cuando __bool__ no devuelve True o False .

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

Sin embargo, no hay tipos incorporados tan locos.

DSM hizo un comentario muy valioso: la popular biblioteca numpy tiene ejemplos en los que bool producirá un error.

 >>> 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 señaló el siguiente caso de la esquina.

Ejemplo estándar, casi universal de stdlib para cosas como esta: un debref.proxy a un objeto muerto generará un error de referencia para casi cualquier operación, incluido bool .

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

Esto no es exclusivo de bool , cualquier función que use su argumento muerto puede generar este error, por ejemplo myfunc = lambda x: print(x) .