pycommentで複数行出力のコメントをサポートした

github.com

pycommentで複数行出力のコメントをサポートした。以前までは出力が複数行に渡った時におかしな出力になってしまっていた。出力されるのはrepr()の表現なので意外と問題なかったのだけれど、numpy.arrayなどと一緒に使ったときに変な出力になっていた。これを直したという話。

pycomment?

pycomment自体の紹介は昔記事を書いた。

雑に言うと、良い感じにrepr表現をコメントとして併記してくれるコマンド。

過去の出力

この変更の前の状態では例えば以下の様なコードが与えられた時に以下の様な出力が返ってきてしまっていた。

import numpy as np

np.arange(9).reshape((3, 3))  # =>
# -- stdout --------------------
# >> ZZ󰀀ZZ3:array([[0, 1, 2],
# >>        [3, 4, 5],
# >>        [6, 7, 8]])ZZ󰀀ZZ

ここで reshape((3,3))のものをrepr()した後の値は以下のようなもの。

array([[0 1 2]
      [3 4 5]
      [6 7 8]])

現在の出力

複数行出力に対応した結果、これからは以下の様な出力になる。頑張った。

import numpy as np

np.arange(9).reshape((3, 3))  # => multi-line..
# array([[0, 1, 2],
#        [3, 4, 5],
#        [6, 7, 8]])
# ..multi-line

multi-line....multi-line で挟む形がきれいとは言えないけれど。むりやり "\n" で一行に纏めるのはきれいではない気がした。一応無難な表現を考えたつもり。とはいえもうちょっと良いレイアウトがあれば変えたいかも。

感想

テスト大切ですね。テストを書いて、リファクタリングして、コードが頭の中に入るようにして、影響箇所を限定的にして、細々としたテストを実行しつつ調整していく感じで粛々とやれば実装できる感じ。

凡人にはテスト大切。

import numpy as np


def reshape(a, shape):
    shape  # => (10, 2)
    return a.reshape(shape)


def main():
    a = np.arange(20)  # => multi-line..
    # array([ 0,  1,  2,  3,  4,  5,  6,  7,  8,  9, 10, 11, 12, 13, 14, 15, 16,
    #        17, 18, 19])
    # ..multi-line
    reshape(a, (2, 10))  # => multi-line..
    # array([[ 0,  1,  2,  3,  4,  5,  6,  7,  8,  9],
    #        [10, 11, 12, 13, 14, 15, 16, 17, 18, 19]])
    # ..multi-line
    reshape(a, (5, 4))  # => multi-line..
    # array([[ 0,  1,  2,  3],
    #        [ 4,  5,  6,  7],
    #        [ 8,  9, 10, 11],
    #        [12, 13, 14, 15],
    #        [16, 17, 18, 19]])
    # ..multi-line
    reshape(a, (4, 5))  # => multi-line..
    # array([[ 0,  1,  2,  3,  4],
    #        [ 5,  6,  7,  8,  9],
    #        [10, 11, 12, 13, 14],
    #        [15, 16, 17, 18, 19]])
    # ..multi-line
    reshape(a, (10, 2))  # => multi-line..
    # array([[ 0,  1],
    #        [ 2,  3],
    #        [ 4,  5],
    #        [ 6,  7],
    #        [ 8,  9],
    #        [10, 11],
    #        [12, 13],
    #        [14, 15],
    #        [16, 17],
    #        [18, 19]])
    # ..multi-line

main()

あとでインデントも直そう。

追記

直した。

ちなみに

ちなみに、こういうのに対応しようとするとかなり死にます。

x = [1, 2, 3]
# =>

以下だけで許してください :bow:

x = [1, 2, 3]  # =>