我一直想知道以下代码段:
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 :(得分:4)
类型bool
是int
的子类型,isinstance
可以通过继承来将True
作为int
类型传递。
使用更严格的type
:
if type(n) is not int:
raise TypeError('input is not an integer')
答案 1 :(得分: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))