2 回答
TA贡献1780条经验 获得超1个赞
您可以设置链式生成器以降低缩进级别。
iter_tasks = (task for job in jobs for task in job.tasks)
iter_commands = (command for task in iter_tasks for command in task.commands)
for command in iter_commands:
print(command.actual_cmd)
我同意OldBunny2800的观点,在三个嵌套循环的情况下,链接生成器在可读性方面可能不会给你带来太多好处。
如果您的嵌套逻辑比这更深,生成器就会开始变得有吸引力。不仅缩进级别受到控制,您还可以为每个生成器分配一个有意义的变量名称,有效地为for循环命名。
TA贡献1943条经验 获得超7个赞
它是蟒蛇式的。已经。
但是如果你担心这会深入 10 层以上,只有最内层的循环有任何有趣的东西,你可以考虑的一件事是创建一个生成器。你的代码可以变成:
def get_command(jobs):
for job in jobs:
for task in job.tasks:
for command in task.commands:
yield command
for command in get_command(jobs):
print command.actual_cmd
所以整个目的是避免过度缩进。
为了使它在多层次上通用,所以即使它有 100 多个层次,你也不用担心:
def get_nested(objlist, attribs):
for x in objlist:
if len(attribs) == 0:
yield x
else:
x_dot_attr = getattr(x, attribs[0])
for y in get_nested(x_dot_attr, attribs[1:]):
yield y
for command in get_nested(jobs, ["tasks", "commands"]):
print command.actual_cmd
但是不,这种概括并没有使它更加pythonic。它只是避免过度缩进。
添加回答
举报