Pretty Print 4

あー。

(Interactive (Expr (BoolOp (And) (Call (Name 'callable' (Load)) (Name 'x' 
  (Load))) (Call (Name 'callable' (Load)) (Name 'x' (Load))))))

という表示になってしまって、期待しているのはそうじゃないんだよなぁ、とprettyprintライブラリのどこを修正するか考えていたが、結局ライブラリの使い方が間違っていただけだった。「1行で収まるなら1行で、そうじゃなければ改行して2番目以降はインデント」とやりたかったので、下のように書いていたけども、

        return pp.union(
            pp.concat(
                pp.Text(head),
                pp.spread(child), # <- ここが間違い
                pp.Text(")")),
            pp.concat(
                pp.Text(head),
                pp.Nest(1, 
                        pp.concat(
                          pp.LINE, 
                          pp.stack(child),
                          pp.Text(")")))))

pp.spread(child)のそれぞれの子要素の中に「改行してもよい」マークが混ざっていると開業されてしまう。これはflatternで囲って1行限定にしてしまう必要がある。

出力結果:

(Interactive 
  (Expr 
    (BoolOp 
      (And)
      (Call (Name 'callable' (Load)) (Name 'x' (Load)))
      (Call (Name 'callable' (Load)) (Name 'x' (Load))))))

うむうむ、そうそう、こういう出力が欲しかったんだよね。

もうすぐ電車が着いてしまうので、ぐちゃぐちゃいじったのをきれいにしよう。