Я всегда задавался вопросом о следующем фрагменте кода:Отфильтровать булевский как нецелый?
import math
def func(n):
if not isinstance(n, int):
raise TypeError('input is not an integer')
return math.factorial(n)
print(func(True))
print(func(False))
Я всегда удивляюсь, в результате из-за True
и False
фактически работают и интерпретируются как целые числа 1
и 0
. Поэтому факториальная функция дает ожидаемые результаты 1
и 1
при использовании True
и False
. Поведение этих логических элементов, очевидно, described in the python manual, и по большей части я могу жить с тем, что логическое является подтипом целого числа.
Тем не менее, мне было интересно: есть ли какой-нибудь умный способ смыть что-то вроде True
как фактический параметр для факторной функции (или любого другого контекста, который требует целых чисел) таким образом, что он выкинет какое-то исключение с которым может справиться программист?
Вы не должны полагаться на строгую проверку типов в python. Если кто-то хочет вызвать функцию с булевым, почему бы и нет? – Daniel
@ Даниэль Я не совсем уверен, почему меня это немного беспокоит. В этом конкретном контексте он просто чувствует неудовлетворенность, чтобы знать, что факториал отлично работает с булевым. Мне было интересно: почему вы предпочитаете использовать строгую проверку типов в Python? – 6q9nqBjo