将布尔值过滤为非整数?

时间:2016-09-18 16:32:08

标签: python integer boolean

我一直想知道以下代码段:

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))

我总是对结果感到惊讶,因为TrueFalse实际上有效,并被解释为整数10。因此,当使用11时,阶乘函数会产生预期结果TrueFalse。那些布尔值的行为显然是described in the python manual,并且在很大程度上我可以忍受布尔值是整数的子类型这一事实。

但是,我想知道:是否有任何聪明的方法可以将True之类的内容作为因子函数(或任何其他需要整数的上下文)的实际参数以某种方式清除它抛出程序员可以处理的某种异常?

2 个答案:

答案 0 :(得分:4)

类型boolint子类型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))