Python:已排序 - 默认情况下不对gitPython分支对象进行排序?

时间:2017-05-15 19:08:16

标签: python list sorting object gitpython

我有这个方法:

def filter_branches_by_names(self, names, exclude=False):
    """Filter branches list using names list.

    Args:
        names (list): names list to use as
            filter condition.
        exclude (bool): If set to False, keep branches in
            names list. If set to True, keep branches not in names
            list. Optional, default: False.
    Returns:
        branch (list): list of git branch objects.
    """
    heads = self.repo.heads
    if exclude:
        return [head for head in heads if head.name not in names]
    else:
        return [head for head in heads if head.name in names]

它过滤掉使用gitPython库访问的分支对象。我不知道这是否与库有特殊之处(或者它适用于所有对象),但是当我对该函数的结果使用sorted时,它实际上并没有对这些对象进行排序。

我的意思是这不起作用:

sorted(self.filter_branches_by_names(['a', 'b'])

这有效:

sorted(self.filter_branches_by_names(['a', 'b'], key=lambda x: x.name)

我正在使用为我的单元测试排序来检查在使用该方法时是否得到正确的分支,所以我实际上并不关心它是如何排序的,只要结果和列表的比较都是相同的。

sorted是不打算对象排序(我认为它使用某种默认参数进行排序),而不是指定key或者它是否是其他内容?

注意:我不是说我希望它按name属性排序。当我没有为sorted指定密钥时,我所说的根本没有排序。似乎人们误解了我。

2 个答案:

答案 0 :(得分:0)

问题不在于sorted,问题是每次从gitPython repo实例访问分支时,它实际上都会创建新的分支对象,因此它会对两个列表进行排序(类似于相同的分支) )分支不同(使用身份地址),因为这些对象是不同的。

但是,如果它们按名称排序(即使创建了新的分支对象,名称也相同),那么它会通过assertEqual检查,即使这些对象不同。

答案 1 :(得分:0)

基类object定义了所有6种丰富的比较方法:__eq____ge____gt__等。这些默认方法按整数对象标识进行比较,由id(obj)返回。在大多数情况下,可以将id视为随机唯一整数。任何类都可以为类的实例定义更合适的比较方法。看来分支对象类没有。我的猜测是该类的作者希望你选择一个属性进行排序。