比较Python 3.4中的不同类型
根据我所了解的,Python 2 允许不同类型之间进行比较,但出于某种原因,Python 3 去掉了这个功能。无论这样做是否合理,我想比较两个任意的值,不管它们是同一种类型还是不同类型。
我了解到在 Python 2 中,不同类型的比较是通过比较类型的名称来实现的,所以我尝试实现了这个方法。
def less_than_or_equal(a, b):
if type(a) == type(b):
return a <= b
else:
return str(type(a)) <= str(type(b))
在我这样做之后,我意识到一些通常可以比较的类型,比如浮点数和整数,使用这个方法比较时并不能正确比较。
我该如何实现这个功能呢?
2 个回答
0
我强烈建议不要尝试这样做,因为2.x的行为被广泛认为是个错误。不过,如果你真的非要模仿它的话……
在2.7版本中,默认的比较规则如下(源代码引用):
None
(空值)总是比其他任何东西都小。- 数字值比非数字值小(除了
None
)。这通过特殊处理实现,就好像它们的类型名称是空字符串一样,而空字符串比其他任何字符串类型都小。这里要注意的是,我们讨论的是普通数字比较已经失败的情况(比如两个complex
(复数)值之间的比较)。 - 其他所有东西根据它们的类型名称进行比较,如果类型相同,则根据它们的地址进行比较。
这里有一个三路比较的例程,可以在3.x中模仿2.x的行为:
from numbers import Number
def typename_or_blank(x):
return '' if isinstance(x, Number) else type(x).__name__
def python2_cmpkey(x, y):
if x == y:
return 0
try:
return -1 if x < y else 1
except TypeError:
if type(x) is type(y):
return id(x) - id(y)
if x is None:
return -1
if y is None:
return 1
return -1 if typename_or_blank(x) < typename_or_blank(y) else 1
要得到问题中的less_than_or_equal
,只需比较结果是否<= 0
。要获得可用于sorted
、min
、max
等函数的排序键,只需用functools.cmp_to_key
包裹一下。
4
你可以先尝试进行比较,然后再用类型字符串作为备用:
def leq(a,b):
try:
return a <= b
except TypeError:
return str(type(a)) <= str(type(b))