我们在python中都犯了这样的错误:
if ( number < string ):
python默默地接受这个并且只是输出错误。
谢天谢地,python 3终于警告我们了。但在某些情况下需要python 2.7。有没有办法在python 2.7中防止这种错误,除了“只是小心”(我们都知道100%的时间不起作用)?
答案 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) ) ):