Richard Knop
Richard Knop

Reputation: 83755

Nicer way of method chaining in Python?

So I have a really long chain of methods, something similar to:

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

It looks quite ugly. Is there some way to put each method on a separate line? Like:

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

Upvotes: 3

Views: 189

Answers (3)

ecatmur
ecatmur

Reputation: 157484

You can use backslash line continuation:

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

or parentheses:

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

But the most Pythonic way to do this would be to abstract the problem into a single function call:

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

Using reduce is another option, but not particularly elegant:

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

or even

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

Upvotes: 12

Michael0x2a
Michael0x2a

Reputation: 64348

You can do this:

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

Upvotes: 2

Ignacio Vazquez-Abrams
Ignacio Vazquez-Abrams

Reputation: 799510

Either escape the newlines or parenthesize the expression.

foo \
.bar \
.baz

(foo
.bar
.baz)

Upvotes: 2

Related Questions