Может ли функция Python bool () вызвать исключение для неверного аргумента? - PullRequest
0 голосов
/ 17 октября 2018

Для таких функций, как int() или float(), возможно вызвать исключение (ValueError), если аргумент не может быть преобразован в соответствующий числовой тип.Следовательно, как правило, рекомендуется заключать их в try-except, если есть вероятность того, что им будет передан недопустимый аргумент.

Но с гибкостью Python, когда дело доходит до «правдивости», я не могу думатьлюбого возможного значения, которое вы могли бы передать функции bool(), которая вызвала бы исключение.Даже если вы вызываете его без каких-либо аргументов, функция завершает работу и возвращает False.

Правильно ли, что bool() просто не вызовет исключение, если вы передадите его не более, чемодин аргумент?И, как результат, нет смысла заключать вызов в try-except?

1 Ответ

0 голосов
/ 17 октября 2018

bool жалуется, когда __bool__ не возвращает True или False.

>>> 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 для таких вещей: слабыйref.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).

...