2016-09-18 9 views
2

Я всегда задавался вопросом о следующем фрагменте кода:Отфильтровать булевский как нецелый?

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 как фактический параметр для факторной функции (или любого другого контекста, который требует целых чисел) таким образом, что он выкинет какое-то исключение с которым может справиться программист?

+0

Вы не должны полагаться на строгую проверку типов в python. Если кто-то хочет вызвать функцию с булевым, почему бы и нет? – Daniel

+0

@ Даниэль Я не совсем уверен, почему меня это немного беспокоит. В этом конкретном контексте он просто чувствует неудовлетворенность, чтобы знать, что факториал отлично работает с булевым. Мне было интересно: почему вы предпочитаете использовать строгую проверку типов в Python? – 6q9nqBjo

ответ

4

Тип boolявляется подтипом из int и isinstance может пройти по наследству передать True как int типа.

Используйте более строже type:

if type(n) is not int: 
    raise TypeError('input is not an integer') 
+0

Спасибо за помощь. Я был полностью слеп, потому что я не знал об этом небольшом нюансе относительно 'type' и' isinstance' до момента назад. – 6q9nqBjo

0

Эта часть кода кажется различать булевых и целочисленных параметров в функциях. Что мне не хватает?

import math 
def func(n): 
    if type(n) == type(True): 
     print "This is a boolean parameter" 
    else: 
     print "This is not a boolean parameter" 
    if not isinstance(n, int): 
     raise TypeError('input is not an integer') 
    return math.factorial(n) 

print(func(True)) 
print(func(False)) 
print(func(1)) 
Смежные вопросы