python isinstance(n,int)和int(n)== n

时间:2013-11-07 02:43:31

标签: python

两个功能:

def check(n):
    if int(n) != n:
        print("int(n) != n")
    else:
        print("int(n) == n")

def check2(n):
    if not isinstance(n, int):
        print("n is not an int")
    else:
        print("n is an int")

有什么区别?哪一个更好?

4 个答案:

答案 0 :(得分:3)

第二个实际上是有效的(因为它不会对不能强制转换为int的东西出错),但它实际上取决于你想要做什么。如果你使用的是纯Python,那么最好的做法就是鸭子类型 - 像这样的函数是一个微小的调整检查,它将检查某些东西是否是一个整数值(例如,它将与{{1一起使用)还有2.0,但不是2,但没有错误输出:

'2'

相反,如果知道def check3(n): "prints 'n is an int' if the value is integral" try: val = int(n) if val == n: print("n is an int") except ValueError: pass # return False would also work print("n is not an int") 1.0之间的区别很重要(例如,你有一个int64 ndarray),那么你想要使用你的实例检查1 ,因为它会让你知道完全是一个int。

归结为这个问题:它必须一个int还是 act 就像一个整数?如果它必须是一个int,那么使用check2,如果它必须 act 就像一个int,使用check(但可能会修改它在try /中,如上所示)。

另一个选择是利用抽象基类来允许int-like(例如,numpy int dtypes是整数,但实际上不是int的子类),使用抽象基类check2

numbers.Integral

另外,def check4(n): if isinstance(n, (int, numbers.Integral)): print("n is an int") else: print("n is not an int") check3 ,因为查询抽象基类的实例检查涉及一些处理。

答案 1 :(得分:2)

您的第一种方法if int(n) != n不是一个好主意。如果n不是字符串或数字,则int的转换将失败并出现例外情况:

>>> class Foo(object):
>>>    pass
>>> f = Foo()
>>> int(f)
TypeError: int() argument must be a string or a number, not 'Foo'

我认为最好的方法(无论如何在Python 2.x中)是:

if  isinstance(n, (int,long)):
    print 'n is an integer type'
else:
    print 'n is not an integer type'

请注意,我正在检查int long。那是因为isinstance(0xDEADBEEF2B84F00D, int) == False

此代码根本不处理浮点值。您尚未向我们提供有关如何使用此代码的任何信息,因此您可以正确处理所有情况。

答案 2 :(得分:2)

主要区别是如果输入不是原始数据,则将输入转换为int将失败,并且只有当输入类型为{{1时} isinstance才为真或者从中获取。因此,最好使用int。检查以下样本运行。

check2

<强>输出

def check(n):
    if int(n) != n:
        print("int(n) != n")
    else:
        print("int(n) == n")

def check2(n):
    if not isinstance(n, int):
        print("n is not an int")
    else:
        print("n is an int")


class myInt(int):
    pass

check(1)
check("1")
#check({})      #Will throw error
#check([])      #Will throw error
check(myInt()) 
print ""
check2(1)
check2("1")
check2({})
check2(myInt())
check2([])

答案 3 :(得分:1)

重新。问题的第一部分,这两个功能正在回答不同的问题。 check正在查看n的数值和(确定)是否具有小数部分。 check2正在查看类型并确定n是否为整数。

  • check使整数等值于n,然后将其与n进行比较。所以int(1.0)==1.0是正确的,因为int(1.0)==1,但是int(“1”)==“1”是假的,因为int("1")==1

  • check2不进行任何转化,只是检查一下n的类型。