2012-06-29 57 views
3

所以我有一个很长的方法链,类似于:更好的Python方法链接方式?

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 

回答

2

要么逃避换行符,要么将表达式括起来。

foo \ 
.bar \ 
.baz 

(foo 
.bar 
.baz) 
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) 
+0

+1抽象成一个单一的功能 – Michael0x2a

+0

你忘了使用'reduce()'来提及。 –

+0

用于括号和append_commands的推荐的+1 - 另一种选择是检查append_command是否是一个序列,但不是从basestring和loop派生的......但是,我喜欢这个答案。 –

2

你可以这样做:

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