避免比较数字和字符串的错误

时间:2015-07-02 18:34:43

标签: python python-2.7

我们在python中都犯了这样的错误:

if ( number < string ):

python默默地接受这个并且只是输出错误。

谢天谢地,python 3终于警告我们了。但在某些情况下需要python 2.7。有没有办法在python 2.7中防止这种错误,除了“只是小心”(我们都知道100%的时间不起作用)?

4 个答案:

答案 0 :(得分:3)

您可以将这两个数字明确转换为int。字符串将被转换,数字不会生效(它已经是一个int)。因此,这可以节省您开始记住数字所包含的值类型的需要:

a = 11
b = "2"
print a > b # prints False, which isn't what you intended
print int(a) > int(b) # prints True

编辑:
如评论中所述,您不能假设数字是整数。但是,应用具有适当功能的同一列 - float应该可以正常工作:

a = 11
b = "2"
print a > b # prints False, which isn't what you intended
print float(a) > float(b) # prints True

答案 1 :(得分:0)

如果你真的,真的想要100%确定比较字符串和整数是不可能的,你可以根据需要重载__builtin__.int(和__builtin__.float等。 )禁止将int(和浮点数等)与字符串进行比较的方法。它看起来像这样:

import __builtin__

class no_str_cmp_int(int):
    def __lt__(self,other):
        if type(other) is str:
            raise TypeError
        return super.__lt__(other)
    def __gt__(self,other):
        if type(other) is str:
            raise TypeError
        return super.__gt__(other)
    # implement __gte__, __lte__ and others as necessary

# replace the builtin int method to disallow string comparisons
__builtin__.int = no_str_cmp_int

x = int(10)

然后,如果您尝试执行此类操作,则会收到此错误:

>>> print x < '15'

Traceback (most recent call last):
  File "<pyshell#15>", line 1, in <module>
    print x < '15'
  File "tmp.py", line 7, in __lt__
    raise TypeError
TypeError

但这种方法有一个重要的警告。它只替换了int函数,因此每次创建int时,都必须通过函数传递它,就像我在上面x的声明中所做的那样。文字将继续是原始int类型,据我所知,没有办法改变这一点。但是,如果您正确创建了这些对象,它们将继续使用您想要的100%保证。

答案 2 :(得分:0)

首先将字符串或任何数据类型转换为float。 当两种数据类型相同时,我们只能比较它们。

假设,

a = "10"
b= 9.3
c=9

我们要添加a,b,c ..所以,

因此,添加这三个的正确方法是将它们转换为相同的数据类型,然后添加。

a = float(a)
b = float(b)
c = float(c)

print a+b+c

答案 3 :(得分:-1)

您可以检查每个变量是否为这样的int:

if ( isinstance(number, int) and isinstance(string, int) ):
   if (number < string):
      Do something
   else:
      Do something else
else :
   print "NaN"

*编辑: 要检查浮动,代码应该是:

if ( isinstance(number, (int,float )) and isinstance(string, (int,float) ) ):