mat*_*tst 10 python python-3.x
以下排序方法非常有效.
def sort_view_items(self):
cs = self.settings.case_sensitive
if self.settings.sort_by_file_name:
sk = lambda vi: (vi.name if cs else vi.name.lower(), vi.group, vi.tab)
elif self.settings.sort_by_folder:
sk = lambda vi: (vi.folder, vi.name if cs else vi.name.lower())
elif self.settings.sort_by_syntax:
sk = lambda vi: (vi.syntax, vi.name if cs else vi.name.lower())
elif self.settings.sort_by_indexes:
sk = lambda vi: (vi.group, vi.tab)
self.view_items.sort(key = sk)
Run Code Online (Sandbox Code Playgroud)
然而lambdas的区分大小写的相关部分vi.name if cs else vi.name.lower()被使用了3次,这使我重复的代码基因变得烦恼.
出于兴趣,可以以某种方式提前设置案例方面,但不对name属性进行永久性更改或在view_items列表的临时副本中进行此类操作吗?
例如,我尝试在lambda中使用lambda,我认为它不会起作用,猜猜是什么,它没有.虽然意外地接受了语法(没有例外),但它只是没有导致实际执行任何排序.
def sort_view_items(self):
cs = self.settings.case_sensitive
name_lambda = lambda vi: vi.name if cs else vi.name.lower()
if self.settings.sort_by_file_name:
sk = lambda vi: (name_lambda, vi.group, vi.tab)
...
Run Code Online (Sandbox Code Playgroud)
你需要实际打电话name_lambda:
sk = lambda vi: (name_lambda(vi), vi.group, vi.tab)
Run Code Online (Sandbox Code Playgroud)
在您的代码段中,name_lambda已正确定义但永远不会被调用.
这需要您向类中添加一个新属性"lower_name",但是这一个更改可以让您大大简化其余代码.
from operator import attrgetter
class Things(object):
@property
def lower_name(self):
return self.name.lower()
def sort_view_items(self):
name_field = "name" if self.settings.case_sensitive else "lower_name"
if self.settings.sort_by_file_name:
fields = (name_field, "group", "tab")
elif self.settings.sort_by_folder:
fields = ("folder", name_field)
elif self.settings.sort_by_syntax:
fields = ("syntax", name_field)
elif self.settings.sort_by_indexes:
fields = ("group", "tab")
self.view_items.sort(key=attrgetter(*fields))
Run Code Online (Sandbox Code Playgroud)
| 归档时间: |
|
| 查看次数: |
447 次 |
| 最近记录: |