提前设置lambda函数的一部分以避免重复代码

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)

flo*_*ake 5

你需要实际打电话name_lambda:

sk = lambda vi: (name_lambda(vi), vi.group, vi.tab)
Run Code Online (Sandbox Code Playgroud)

在您的代码段中,name_lambda已正确定义但永远不会被调用.


che*_*ner 5

这需要您向类中添加一个新属性"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)

  • 您应该将您的名称命名(在sort_view_items的第一行中)`name_field`以与其余代码一致.否则,很好地使用了attrgetter.并且_please_使用`.casefold`进行casefolding而不是`.lower`(如果你的Python足够新). (2认同)