Python:已排序 - 默认情况下不对 gitPython 分支对象进行排序?
Python: sorted - not sorting gitPython branch objects by default?
我有这个方法:
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
指定键时,它根本不会排序。看来大家误会我了
问题不在于 sorted
,问题在于每次从 gitPython
repo 实例访问分支时,它实际上会创建新的分支对象,因此它对两个列表进行排序(有点相同的分支)分支不同(使用身份地址),因为那些对象不同。
但是,如果它们按名称排序(即使创建了新的分支对象,名称也是相同的),那么它会通过 assertEqual
检查,即使这些对象不同。
基础classobject
定义了所有6种丰富的比较方法:__eq__
、__ge__
、__gt__
等。这些默认方法按 id(obj)
返回的整数对象标识进行比较。对于大多数目的,可以将 id 视为随机唯一整数。任何 class 都可以为 class 的实例定义更合适的比较方法。分支对象 class 似乎没有。我的猜测是 class 的作者希望您 select 一个用于排序的属性。
我有这个方法:
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
指定键时,它根本不会排序。看来大家误会我了
问题不在于 sorted
,问题在于每次从 gitPython
repo 实例访问分支时,它实际上会创建新的分支对象,因此它对两个列表进行排序(有点相同的分支)分支不同(使用身份地址),因为那些对象不同。
但是,如果它们按名称排序(即使创建了新的分支对象,名称也是相同的),那么它会通过 assertEqual
检查,即使这些对象不同。
基础classobject
定义了所有6种丰富的比较方法:__eq__
、__ge__
、__gt__
等。这些默认方法按 id(obj)
返回的整数对象标识进行比较。对于大多数目的,可以将 id 视为随机唯一整数。任何 class 都可以为 class 的实例定义更合适的比较方法。分支对象 class 似乎没有。我的猜测是 class 的作者希望您 select 一个用于排序的属性。