Apa cara yang tepat untuk memformat dict multi-line dengan Python?

184

Dengan Python, saya ingin menulis dict multi-line dalam kode saya. Ada beberapa cara untuk memformatnya. Berikut adalah beberapa yang dapat saya pikirkan:

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

Saya tahu bahwa salah satu di atas secara sintaksis benar, tetapi saya berasumsi bahwa ada satu lekukan yang disukai dan gaya line-break untuk dicts Python. Apa itu?

Catatan: Ini bukan masalah sintaksis. Semua hal di atas adalah (sejauh yang saya tahu) pernyataan Python yang valid dan setara satu sama lain.

Ryan C. Thompson
sumber
12
Untuk 1 dan 2: Tidak ada spasi langsung di dalam kawat gigi, lihat PEP 8.
Sven Marnach
3
Saya ingin mengatakan bahwa dalam modul python print, ia menggunakan contoh pertama Anda, tanpa spasi langsung di dalam kawat gigi.
charmoniumQ

Jawaban:

239

Saya menggunakan # 3. Sama untuk daftar panjang, tupel, dll. Tidak perlu menambahkan spasi tambahan di luar lekukan. Seperti biasa, konsistenlah.

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

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

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

Demikian pula, inilah cara yang saya sukai untuk memasukkan string besar tanpa memperkenalkan spasi kosong (seperti yang akan Anda dapatkan jika Anda menggunakan string multi-line tiga kutip):

data = (
    "iVBORw0KGgoAAAANSUhEUgAAABAAAAAQCAYAAAAf8/9hAAAABG"
    "l0RVh0U29mdHdhcmUAQWRvYmUgSW1hZ2VSZWFkeXHJZTwAAAEN"
    "xBRpFYmctaKCfwrBSCrRLuL3iEW6+EEUG8XvIVjYWNgJdhFjIX"
    "rz6pKtPB5e5rmq7tmxk+hqO34e1or0yXTGrj9sXGs1Ib73efh1"
    "AAAABJRU5ErkJggg=="
)
FogleBird
sumber
Bisakah Anda memasukkan beberapa referensi, Saya mengalami kesulitan menemukan sumber otoritatif tentang ini. (Saya setuju dengan Anda).
Trufa
82
Hmm, saya menemukan ini: stackoverflow.com/questions/6388187/…
FogleBird
6
Jangan katakan padanya tetapi pengguna itu tidak tahu apa yang dia bicarakan; P
Trufa
3
lol, lebih serius, saya juga tidak bisa menemukan referensi "resmi". Saya akan memberi tahu Anda jika saya melakukannya! Mungkin seseorang harus menghubungi Guido.
FogleBird
2
Ini cocok dengan PEP 8: python.org/dev/peps/pep-0008/#indentation . Ada beberapa contoh daftar di bagian bawah pada bagian indentasi.
ams
31

Pertama-tama, seperti dikatakan Steven Rumbalski, "PEP8 tidak menjawab pertanyaan ini", jadi ini adalah masalah pilihan pribadi.

Saya akan menggunakan format yang serupa tetapi tidak identik dengan format Anda 3. Ini milik saya, dan mengapa.

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()
RayLuo
sumber
Saya suka komentar in line. profesor pemrograman pertama saya (saya sudah pemrograman bertahun-tahun sebelumnya) bersikeras komentar inline, tetapi tidak pernah secara efektif menjelaskan mengapa. Anda sekarang telah menjelaskan praktik yang telah saya gunakan selama sekitar 20 tahun.
Joshua K
Aha, terima kasih. Kami memiliki usia, pengalaman, dan "jarak tempuh" yang sama dalam hal pemrograman. Jadi, jika Anda sudah memulai praktik komentar inline 20 tahun yang lalu (yang mengesankan!), Mengapa Anda masih memerlukan penjelasan profesor Anda mungkin 10 tahun yang lalu ketika Anda berada di universitas Anda? Hanya penasaran. :-)
RayLuo
pertanyaan yang sangat bagus :) ATARI BASIC dan GWbasic secara praktis memaksanya, menjadi kompiler berbasis garis aliran top-down. itu sesuatu yang saya adopsi ketika saya membaca BASIC peter norton (dan kemudian kode ASM) di majalah kertas. saya belajar Turbo Pascal di antaranya, tetapi saya sudah belajar dari contoh-contoh di majalah kertas dan menyesuaikan dengan batasan BASIC.
Joshua K
PEP8 agak mengatasinya karena merekomendasikan untuk tidak menambahkan spasi segera setelah tanda kurung buka, sehingga opsi 1 dan 2 di OP keluar.
Daniel Serodio
9

Karena kunci Anda adalah string dan karena kita berbicara tentang keterbacaan, saya lebih suka:

mydict = dict(
    key1 = 1,
    key2 = 2,
    key3 = 3,
)
dugres
sumber
6
Lebih suka tidak menggunakan spasi saat mendefinisikan kwargs. c = function(a=1, b=2)lebih "pythonic".
Steve K
1

Biasanya, jika Anda memiliki objek python besar cukup sulit untuk memformatnya. Saya pribadi lebih suka menggunakan beberapa alat untuk itu.

Berikut ini adalah python-beautifier - www.cleancss.com/python-beautify yang secara instan mengubah data Anda menjadi gaya yang dapat disesuaikan.

Maks
sumber
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(",", "")))
gaurav raj
sumber
Ini tidak menjawab pertanyaan
bagerard
-1

Dari pengalaman saya dengan tutorial, dan hal-hal lain nomor 2 sepertinya selalu lebih disukai, tetapi ini adalah pilihan preferensi pribadi lebih dari apa pun.

Jake
sumber
-6

Secara umum, Anda tidak akan menyertakan koma setelah entri terakhir, tetapi Python akan memperbaikinya untuk Anda.

Joe
sumber
34
Tidak! Selalu sertakan koma terakhir, jadi jika Anda menambahkan elemen terakhir baru, Anda tidak perlu mengubah baris sebelum itu. Ini adalah salah satu hal hebat tentang Python: kepraktisan atas kemurnian.
Ned Batchelder
2
Selain itu, jawaban ini tidak menjawab pertanyaan yang diajukan.
RKD314