1. ホーム
  2. python

Pythonのリストコンプリートをインデントするには?

2023-09-28 03:45:52

質問

リスト内包はある種の状況では便利ですが、読むとかなり恐ろしくなることもあります。少し大げさな例として、次のようにインデントするとどうなるでしょうか?

allUuids = [x.id for x in self.db.query(schema.allPostsUuid).execute(timeout = 20) if x.type == "post" and x.deleted is not False]

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

長さによります。私はこのような構成にすることが多いです。

[x.id for x
 in self.db.query(schema.allPostsUuid).execute(timeout=20)
 if x.type == 'post' 
    and x.deleted is not False
    and ...
    and ...]

こうすることで、すべての式が独自の行を持つようになります。

もし行が大きくなりすぎたら、ラムダや式でそれを抜き出したいですね。

transform = lambda x: x.id
results = self.db.query(schema.allPostsUuid).execute(timeout=20)
condition = lambda x: x.deleted is not False and ... and ...
[transform(x) for x in results if condition(x)]

そして、ラムダが長くなりすぎた場合は関数に昇格します。