検索
連載

[Pythonクイズ]長ーーーい1行のコード、バックスラッシュを使わずに行分割できますか?Pythonステップアップクイズ

Pythonのコードを書いていて1文がとても長くなるときには、それを複数の行に分けて書くのが普通ですよね。このとき、バックスラッシュを使っている人もいるでしょう。でも、バックスラッシュを使わない方法もあるんですよ。

PC用表示 関連情報
Share
Tweet
LINE
Hatena
「Pythonステップアップクイズ」のインデックス

連載目次

バックスラッシュでの行分割が好みじゃないって人はたくさんいるのでは?
バックスラッシュでの行分割が好みじゃないって人はたくさんいるのでは?

【問題】

 以下は何かの計算をするPythonコードである。だが、変数total_priceへの代入文が長いのでバックスラッシュ「\」を使って行分割している。バックスラッシュを使わないようにして、加えてもっとコードを読みやすくするにはどうしたらよいだろう。

product_quantity =
product_price =
discount_value =
service_charge =

total_price = product_quantity * product_price - \
              (product_quantity * discount_value) + \
              service_charge

行末のバックスラッシュは好みじゃない(HPかわさき)


かわさき

 こんにちは。HPかわさきです。X(旧Twitter)にアカウントを作ったはいいけれど、プロフィールを編集したり、何だりかんだりしていたらシャドウバンを食らってしまいました(乾いた笑い)。

シャドウバンという仮ラベルを付けられたことのお知らせ
シャドウバンという仮ラベルを付けられたことのお知らせ

 偽装行為の疑いだということです。まー、HPかわさきと今こうやって原稿を書いている人間は同一人物の別人格という設定なので、それを偽装と言われちゃうと偽装かもしれませんけど、何とかなりませんかね。

 このままシャドウバンが解除されないってのもアレなんで、リンクを含まないポストとか(リンクはメンションの形でポスト)、ハッシュタグを使わないポストとかをちょっと多めにしてみるつもりです(1年後に備えて、Python 3.14の新機能を勉強して、そのことをポストしていく予定)。

 X内で「from:hp_kawasaki」で検索とかしないでくださいね! 悲しくなるから。


【答え】

 以下に正解のコード例を示します。

total_price = (product_quantity * product_price
               - (product_quantity * discount_value)
               + service_charge)

代入文の右辺全体をかっこで囲んで、演算子は行末から行頭に移動する

 問題のコードではバックスラッシュを用いた「明示的な行継続」によって1つの代入文を複数の行に分けて記述していました。正解のコード例では代入文の右辺全体をかっこ「()」で囲んで「非明示的な行継続」を行うことでバックスラッシュを使わないようにしています。また、2つの演算子を行末から行頭に移動することで、足し算をするのか引き算をするのかが一目で分かるようになっています。

もっとキレイな(?)行分割のやり方(どっちがキレイだと思います?)
もっとキレイな(?)行分割のやり方(どっちがキレイだと思います?)

 一応、正解は上のコードとしておきます。が、比較用のコードでもいいんじゃない? と個人的には思っています。これについては以下の解説で触れることにしましょう。

【解説】

 Pythonではバックスラッシュ「\」を行末に置くことで、1つの論理行(ここでは代入文)を複数の行(これを物理行と呼びます)に分割して記述できます。これを「明示的な行継続」といいます。問題文のコードはこれを使っています。

total_price = product_quantity * product_price - \
              (product_quantity * discount_value) + \
              service_charge

明示的な行継続

 一方で、かっこ「()」や角かっこ「[]」、波かっこ「{}」に囲まれた範囲はバックスラッシュを使わないでも1つの論理行を複数の物理行に分割して記述できます。これを「非明示的な行継続」といいます。関数呼び出し時に引数を複数行に分けて書けるのはこのおかげですね。

 正解のコード例では代入文の右辺全体をかっこで囲むことで、非明示的な行継続を行えるようにしているわけです。

total_price = (product_quantity * product_price
               - (product_quantity * discount_value)
               + service_charge)

代入文の右辺全体をかっこで囲んで非明示的な行継続を可能とする

 そして、正解のコード例の変更点はもう1つあります。それは演算子の位置です。問題文では行末に演算子を置いて、バックスラッシュで行を継続していました。しかし、正解例では行頭に演算子を置くようになっています。

 これについては、PEP 8「Style Guide for Python Code」の「Should a Line Break Before or After a Binary Operator?」で述べられています。簡単にまとめると、演算子を行末に置くことのデメリットは「複数行のバラバラな位置に演算子があるので見やすくない」「演算子とその対象を確認するために余計な労力が必要」といったことになります。

 行末ではなく行頭に演算子を置けば、各行の決まった位置に演算子があることになるのでコードもスッキリして見えるようになって、演算の対象が演算子の右隣にあるので何をしたいかもすぐに分かるということでしょう。

 行末に演算子を置いたバージョンのコードも掲載するので、ホントかどうかは自分で判断してください。

total_price = (product_quantity * product_price -
               (product_quantity * discount_value) +
               service_charge)

演算子を行末に置いたバージョン

 とはいえ、既存のコードでどのような書き方をしているかが重要です。既存のコードでは演算子を末尾に置くスタイルが採用されているというのであれば、それとの一貫性こそが重要です。もしそういう状況なら、演算子は末尾に置くスタイルを採用するのがよいでしょう。


かわさき

 ちなみに筆者は演算子を行末に置くタイプの人間です。言っていることは分かるけど、このコーディングスタイルを順守している人ってどれだけいるのかなぁ。

 ちなみに、Python入門では明示的な行継続、非明示的な行継続については触れてはいるものの「絶対読んでね! 約束だよ!」といえるほどの量は書いていないようです(もう遠い記憶)。

 今回のネタと似た話題のお話をしているのは「Pythonコーディングスタイルガイド」くらいじゃないでしょうか。PEP 8は英語で書かれていますが、こちらはそのエッセンスを日本語でまとめているので、英語じゃなくて日本語で読みたいなという人にはオススメです。

 そういうわけで、今回はバックスラッシュを使いたくなければ、かっこを使うって覚えておけばいいんじゃないかな。演算子の位置は、状況によるってことで。


「Pythonステップアップクイズ」のインデックス

Pythonステップアップクイズ

Copyright© Digital Advantage Corp. All Rights Reserved.

[an error occurred while processing this directive]
ページトップに戻る