比较Python 3.4中的不同类型

0 投票
2 回答
1055 浏览
提问于 2025-04-18 06:02

根据我所了解的,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版本中,默认的比较规则如下(源代码引用):

  1. None(空值)总是比其他任何东西都小。
  2. 数字值比非数字值小(除了None)。这通过特殊处理实现,就好像它们的类型名称是空字符串一样,而空字符串比其他任何字符串类型都小。这里要注意的是,我们讨论的是普通数字比较已经失败的情况(比如两个complex(复数)值之间的比较)。
  3. 其他所有东西根据它们的类型名称进行比较,如果类型相同,则根据它们的地址进行比较。

这里有一个三路比较的例程,可以在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。要获得可用于sortedminmax等函数的排序键,只需用functools.cmp_to_key包裹一下。

4

你可以先尝试进行比较,然后再用类型字符串作为备用:

def leq(a,b):
    try:
        return a <= b
    except TypeError:
        return str(type(a)) <= str(type(b))

撰写回答