我有一个从另一种语言移植的功能,你能帮我把它变成"pythonic"吗?
这里的函数以"非pythonic"的方式移植(这是一个人为的例子 - 每个任务都与项目或"无"相关联,我们需要一个不同项目的列表,不同的意思是没有重复的.identifier属性,从任务列表开始):
@staticmethod
def get_projects_of_tasks(task_list):
projects = []
project_identifiers_seen = {}
for task in task_list:
project = task.project
if project is None:
continue
project_identifier = project.identifier
if project_identifiers_seen.has_key(project_identifier):
continue
project_identifiers_seen[project_identifier] = True
projects.append(project)
return projects
Run Code Online (Sandbox Code Playgroud)
我特别没有开始让它"pythonic"不要从错误的脚开始(例如列表理解"如果project.identifier不是None,filter()基于查找基于字典的标识符注册表的谓词,使用set()去除重复项等)
编辑:
根据反馈,我有这个:
@staticmethod
def get_projects_of_tasks(task_list):
projects = []
project_identifiers_seen = set()
for task in task_list:
project = task.project
if project is None:
continue
project_identifier = project.identifier
if project_identifier in project_identifiers_seen:
continue
project_identifiers_seen.add(project_identifier)
projects.append(project)
return projects
Run Code Online (Sandbox Code Playgroud)
关于这段代码没有任何大量的非语言.一些可能的改进:
project_identifiers_seen 可以是一个集合,而不是字典.foo.has_key(bar) 拼写得更好 bar in foostaticmethod一堂课.除非你实际上在进行数据封装,否则通常不需要Python中的类.如果这只是一个普通函数,请将其设置为模块级函数.