1. ホーム
  2. python

[解決済み] 長い関数名を複数行に渡って分割することは可能ですか?

2023-05-20 05:33:58

質問

私たちの開発チームは、PEP8リンターを使用しています。 行の長さは最大80文字です。 .

私がpythonでユニットテストを書いているとき、私が好きなのは 説明的なメソッド名 を付けて、それぞれのテストが何をするのか説明するのが好きです。しかし、これはしばしば文字数制限を超えることになります。

長すぎる関数の例です。

class ClientConnectionTest(unittest.TestCase):

    def test_that_client_event_listener_receives_connection_refused_error_without_server(self):
        self.given_server_is_offline()
        self.given_client_connection()
        self.when_client_connection_starts()
        self.then_client_receives_connection_refused_error()

私のオプション

  • もっと短いメソッド名を書けばいいじゃない!

    わかってるんだけど、テスト名の記述性を失いたくないんだよね。

  • 長い名前を使う代わりに、各テストの上に複数行のコメントを書くことができます!

    これは良いアイデアですが、IDE (PyCharm) 内でテストを実行するときにテスト名を見ることができなくなります。

  • おそらく、バックスラッシュ(論理的な行の継続文字)で行を継続することができます。

    残念ながらこれはPythonのオプションではありません、Danの回答で言及されているように。

  • テストのlint化をやめればいい。

    これはある意味で理にかなっていますが、よくフォーマットされたテストスイートを奨励するのはいいことです。

  • 行数制限を増やせばいいんじゃない?

    私たちのチームは、狭いディスプレイでも読みやすいコードを維持するのに役立つので、この制限を設けることを好んでいます。 ベスト オプションではありません。

  • を削除することができます。 test を削除してください。

    これはオプションではありません。Pythonのテストランナーは、すべてのテストメソッドの先頭に test で始まる必要があり、そうでなければ拾えません。

    編集:テストランナーによっては、テスト関数を検索するときに正規表現を指定できるものもありますが、プロジェクトで働くすべての人に余分な設定を強いることになるので、私はこれをやりたくはありません。

  • EventListenerを独自のクラスに分離して、別々にテストすることができます。

    イベントリスナー を独自のクラスにしています (そしてテストされています)。それは、ClientConnectionの中で起こるイベントによってトリガーされるインターフェースに過ぎません。この種の提案は良い意図を持っているように見えますが、誤った方向に誘導され、元の質問に答える助けにはなりません。

  • BDD Frameworkのようなものを使うことができます。 振舞う . これは、表現力豊かなテストのために設計されています。

    これは本当で、今後もっと使っていきたいと思っています。行をまたいで関数名を分割する方法はまだ知りたいところですが。

最終的には...

Pythonで次のような方法はありますか? 長い関数宣言を複数行に渡って分割する ?

例えば...

def test_that_client_event_listener_receives_
  connection_refused_error_without_server(self):
    self.given_server_is_offline()
    self.given_client_connection()
    self.when_client_connection_starts()
    self.then_client_receives_connection_refused_error()

それとも、自分で噛み砕いて短くするしかないのでしょうか?

どのように解決するのですか?

いいえ、これは不可能です。

ほとんどの場合、読みやすさと関数の使いやすさの観点から、このような長い名前は望ましくありません。しかし、テスト名の使用例はかなり合理的であると思われます。

その の辞書的なルールは の字句規則では、一つのトークン (この場合は識別子) が複数の行にまたがって分割されることは許されません。論理的な行の継続文字 ( \ は複数の物理行を一つの論理行に結合することはできますが、一つの トークン を複数の行にまたがるように結合することはできません。