Python中更好的方法链方式?

3

所以我有一个非常长的方法链,类似于:

return self.append_command("fbghasjfa").append_command(input_file_part).append_command(output_video_codec_part).append_command(output_resolution_part).append_command(output_video_bitrate_part).append_command(strict_part).append_command(output_audio_codec_part).append_command(output_number_of_audio_channels_part).append_command(output_audio_bitrate_part).append_command(output_file_part).__finalized

它看起来很丑。有没有办法将每个方法放在单独的一行上?就像这样:

return self.append_command("ffasfgas")
.append_command("fvasgvsd")
.append_command("hsdhsdhsd")
#etc
3个回答

12

你可以使用反斜杠进行行继续:

return self.append_command("ffasfgas") \
    .append_command("fvasgvsd") \
    .append_command("hsdhsdhsd")

或括号:

return (self.append_command("ffasfgas")
        .append_command("fvasgvsd")
        .append_command("hsdhsdhsd"))

但是,最符合Python风格的做法是将问题抽象为单个函数调用:

return self.append_commands("ffasfgas",
                            "fvasgvsd",
                            "hsdhsdhsd")

使用 reduce 是另一个选择,但不是特别优雅:

return reduce(MyClass.append_command, ["ffasfgas",
                                       "fvasgvsd",
                                       "hsdhsdhsd"], self)

甚至可以

return reduce(operator.methodcaller('append_command'),
              ["ffasfgas",
               "fvasgvsd",
               "hsdhsdhsd"], self)

你忘记提到使用 reduce() 了。 - Ignacio Vazquez-Abrams
+1 for parentheses and recommendation of append_commands - 另一个选择可能是检查append_command是否为序列,但不是从basestring派生的,并循环... 但我喜欢这个答案。 - Jon Clements
@IgnacioVazquez-Abrams 表示他加入了,但是有些不情愿。 - ecatmur
1
欣赏这种“不情愿”... ;) 但是,如果它被引入为add_commands,那么没问题,用户不必知道它使用的是reduce... - Jon Clements

2

要么转义换行符,要么将表达式括起来。

foo \
.bar \
.baz

(foo
.bar
.baz)

2
你可以这样做:
return self.append_command("ffasfgas") \
           .append_command("fvasgvsd") \
           .append_command("hsdhsdhsd") 
# etc

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接