Pythonで複数行のdictをフォーマットする適切な方法は何ですか?


184

Pythonでは、コードに複数行のdictを記述します。フォーマットする方法はいくつかあります。私が考えることができるいくつかはここにあります:

  1. mydict = { "key1": 1,
               "key2": 2,
               "key3": 3, }
  2. mydict = { "key1": 1,
               "key2": 2,
               "key3": 3,
             }
  3. mydict = {
        "key1": 1,
        "key2": 2,
        "key3": 3,
    }

上記のいずれも構文的に正しいことは知っていますが、Python dictには1つの優先インデントと改行スタイルがあると思います。それは何ですか?

注:これは構文の問題ではありません。上記のすべては(私の知る限り)有効なPythonステートメントであり、互いに同等です。


12
1及び2の場合:なしスペース直接内側のブレース、PEP 8参照
スヴェンMarnach

3
pythons pprintモジュールでは、中括弧の中に直接スペースを入れずに最初の例を使用していることを言いたいです。
charmoniumQ 2013年

回答:


239

#3を使用します。長いリストやタプルなどでも同じです。インデントを超えて余分なスペースを追加する必要はありません。いつものように、一貫している。

mydict = {
    "key1": 1,
    "key2": 2,
    "key3": 3,
}

mylist = [
    (1, 'hello'),
    (2, 'world'),
]

nested = {
    a: [
        (1, 'a'),
        (2, 'b'),
    ],
    b: [
        (3, 'c'),
        (4, 'd'),
    ],
}

同様に、空白を導入せずに大きな文字列を含めるための私の好ましい方法は次のとおりです(三重引用符で囲まれた複数行の文字列を使用した場合に得られるように)。

data = (
    "iVBORw0KGgoAAAANSUhEUgAAABAAAAAQCAYAAAAf8/9hAAAABG"
    "l0RVh0U29mdHdhcmUAQWRvYmUgSW1hZ2VSZWFkeXHJZTwAAAEN"
    "xBRpFYmctaKCfwrBSCrRLuL3iEW6+EEUG8XvIVjYWNgJdhFjIX"
    "rz6pKtPB5e5rmq7tmxk+hqO34e1or0yXTGrj9sXGs1Ib73efh1"
    "AAAABJRU5ErkJggg=="
)

参考資料を教えてください。これに関する信頼できる情報源を見つけるのに苦労しています。(私はあなたに同意します)。
Trufa

82
:うーん、私はこの発見stackoverflow.com/questions/6388187/...
FogleBird

6
彼に言わないでください、しかしそのユーザーは彼が何について話しているのか分かりません; P
トゥルーファ

3
笑、もっと真剣に、私は「権威ある」参照も見つけることができませんでした。もしそうならあなたに知らせます!おそらく誰かがGuidoに連絡する必要があります。
FogleBird 2011年

2
これはPEP 8と一致します:python.org/dev/peps/pep-0008/#indentation。インデントに関するセクションの下部にいくつかのリストの例があります。
AMS

31

まず第一に、スティーブン・ルンバルスキーが言ったように、「PEP8はこの問題に取り組んでいない」ので、それは個人的な好みの問題です。

私はあなたのフォーマット3と似ているが同一ではないフォーマットを使用します。これが私のものであり、その理由です。

my_dictionary = { # Don't think dict(...) notation has more readability
    "key1": 1, # Indent by one press of TAB (i.e. 4 spaces)
    "key2": 2, # Same indentation scale as above
    "key3": 3, # Keep this final comma, so that future addition won't show up as 2-lines change in code diff
    } # My favorite: SAME indentation AS ABOVE, to emphasize this bracket is still part of the above code block!
the_next_line_of_code() # Otherwise the previous line would look like the begin of this part of code

bad_example = {
               "foo": "bar", # Don't do this. Unnecessary indentation wastes screen space
               "hello": "world" # Don't do this. Omitting the comma is not good.
} # You see? This line visually "joins" the next line when in a glance
the_next_line_of_code()

btw_this_is_a_function_with_long_name_or_with_lots_of_parameters(
    foo='hello world',  # So I put one parameter per line
    bar=123,  # And yeah, this extra comma here is harmless too;
              # I bet not many people knew/tried this.
              # Oh did I just show you how to write
              # multiple-line inline comment here?
              # Basically, same indentation forms a natural paragraph.
    ) # Indentation here. Same idea as the long dict case.
the_next_line_of_code()

# By the way, now you see how I prefer inline comment to document the very line.
# I think this inline style is more compact.
# Otherwise you will need extra blank line to split the comment and its code from others.

some_normal_code()

# hi this function is blah blah
some_code_need_extra_explanation()

some_normal_code()

私はインラインコメントが好きです。私の最初のプログラミング教授(私は何年も前からプログラミングをしていた)はインラインコメントを主張したが、その理由を効果的に説明したことはなかった。これで、私が約20年間使用してきた方法を説明しました。
ジョシュアK

あ、ありがとう。プログラミングに関しては、年齢、経験、「マイレージ」はほぼ同じです。それで、20年前にインラインコメントの練習を始めた場合(これは印象的です!)、大学にいたときにおそらく10年前に教授の説明が必要なのはなぜですか。ちょっと興味があるんだけど。:-)
RayLuo 2013

非常に良い質問:) ATARI BASICとGWbasicは、トップダウンのフローラインベースのコンパイラであることを事実上強制しました。紙の雑誌でピーター・ノートンのBASIC(およびその後のASMコード)を読んだときに採用したものです。その間にターボパスカルを学びましたが、私はすでに紙の雑誌の例から学び、BASICの制限に適合していました。
ジョシュアK

PEP8は、左中括弧の直後にスペースを追加しないことを推奨しているため、多少対処しています。したがって、OPのオプション1と2は廃止されています。
Daniel Serodio 2014

9

あなたのキーは文字列であり、読みやすさについて話しているので、私は好む:

mydict = dict(
    key1 = 1,
    key2 = 2,
    key3 = 3,
)

6
クワーグを定義するときにスペースを使用しないことをお勧めします。c = function(a=1, b=2)より「pythonic」です。
スティーブK

1

通常、大きなpythonオブジェクトがある場合、それらをフォーマットするのは非常に困難です。私は個人的にはそのためにいくつかのツールを使用することを好みます。

これがpython-beautifier-www.cleancss.com/python-beautifyで、データを即座にカスタマイズ可能なスタイルに変換します。


0
dict(rank = int(lst[0]),
                grade = str(lst[1]),
                channel=str(lst[2])),
                videos = float(lst[3].replace(",", " ")),
                subscribers = float(lst[4].replace(",", "")),
                views = float(lst[5].replace(",", "")))

これは質問の答えにはなりません
bagerard

-1

チュートリアルなどでの私の経験から、2番目は常に好ましいように見えますが、何よりも個人的な好みの選択です。


-6

通常、最後のエントリの後にコンマを含めませんが、Pythonがそれを修正します。


34
番号!常に最後のコンマを含めるため、新しい最後の要素を追加する場合、その前の行を変更する必要はありません。これはPythonの優れた点の1つです。純粋性よりも実用性です。
Ned Batchelder

2
さらに、この回答は、尋ねられた質問には対応していません。
RKD314
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.