Python'da çok satırlı bir dikdörtgeni biçimlendirmenin doğru yolu nedir?


184

Python'da, koduma çok satırlı bir dikte yazmak istiyorum. Bunu biçimlendirmenin birkaç yolu vardır. İşte aklıma gelen birkaç şey:

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

Yukarıdakilerin herhangi birinin sözdizimsel olarak doğru olduğunu biliyorum, ancak Python dikte için tercih edilen bir girinti ve satır sonu stili olduğunu varsayıyorum. Bu ne?

Not: Bu bir sözdizimi sorunu değildir. Yukarıdakilerin hepsi (bildiğim kadarıyla) geçerli Python ifadeleridir ve birbirine eşdeğerdir.


12
1 ve 2 için: Doğrudan diş telleri içinde boşluk yok, bkz. PEP 8.
Sven Marnach

3
Pythons pprint modülünde, parantez içinde doğrudan boşluk olmadan ilk örneğinizi kullandığını söylemek istiyorum.
charmoniumQ

Yanıtlar:


239

# 3 kullanıyorum. Uzun listeler, tuples, vb. İçin aynıdır. Girintilerin ötesinde fazladan boşluk eklenmesine gerek yoktur. Her zaman olduğu gibi tutarlı olun.

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

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

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

Benzer şekilde, herhangi bir boşluk eklemeden büyük dizeleri dahil etmeyi tercih ettiğim yöntem (üç tırnaklı çok satırlı dizeler kullanırsanız alacağınız gibi):

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

Biraz referans ekleyebilir misiniz, bu konuda yetkili bir kaynak bulmakta sorun yaşıyorum. (Sana katılıyorum).
Trufa


6
Ona söyleme ama bu kullanıcının ne hakkında konuştuğuna dair hiçbir fikri yok; P
Trufa

3
lol, daha ciddisi, ben de "yetkili" bir referans bulamadık. Eğer yaparsam size haber vereceğim! Belki birisi Guido ile temasa geçmelidir.
FogleBird

2
Bu, PEP 8 ile eşleşir: python.org/dev/peps/pep-0008/#indentation . Girinti kısmının altında bazı liste örnekleri vardır.
ams

31

Her şeyden önce, Steven Rumbalski'nin dediği gibi, "PEP8 bu soruyu ele almıyor", bu yüzden kişisel tercih meselesi.

Biçim 3'ünüzle benzer ancak özdeş olmayan bir biçim kullanırdım. İşte benim ve neden.

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()

Satırdaki yorumu beğendim. İlk programlama profesörüm (daha önce yıllardır programlama yapıyordum) satır içi yorumlarda ısrar etti, ancak nedenini etkili bir şekilde açıklamadı. şimdi yaklaşık 20 yıldır kullandığım bir uygulamayı açıkladınız.
Joshua K

Aha, teşekkürler. Programlama açısından benzer yaş, deneyim ve "kilometre" değerine sahibiz. Öyleyse, bu satır içi yorum uygulamasına 20 yıl önce başladıysanız (ki bu etkileyici!), Neden hala 10 yıl önce üniversitenizdeyken profesörünüzün açıklamasına hala ihtiyaç duydunuz? Sadece merak. :-)
RayLuo

çok iyi bir soru :) ATARI BASIC ve GWbasic yukarıdan aşağıya akış hattı tabanlı derleyiciler olmak üzere pratikte zorladı. peter norton'ın BASIC'i (ve daha sonra ASM kodunu) kağıt dergilerinde okurken benim aldığım bir şey. Turbo Pascal'ı arada öğrendim, ancak kağıt dergilerindeki örneklerden zaten öğrendim ve BASIC'in sınırlamalarına uydum.
Joshua K

PEP8, bir açılış ayracı hemen sonra boşluk eklemeye karşı önerdiğinden, biraz hitap ediyor, bu nedenle OP'deki 1 ve 2 seçenekleri dışarıda.
Daniel Serodio

9

Anahtarlarınız dize olduğundan ve okunabilirlikten bahsettiğimiz için şunları tercih ederim:

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

6
Kwargları tanımlarken boşluk kullanmamayı tercih edin. c = function(a=1, b=2)daha çok "pitonik" tir.
Steve K


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(",", "")))

Bu soruya cevap vermiyor
bagerard

-1

Öğreticiler ve 2 numaralı diğer şeylerle olan deneyimimden her zaman tercih edilen gibi görünüyor, ancak her şeyden çok kişisel bir tercih seçeneği.


-6

Genel olarak, son girişten sonra virgül eklemezsiniz, ancak Python bunu sizin için düzeltir.


34
Hayır! Her zaman son virgül ekleyin, bu nedenle yeni bir son öğe eklerseniz, çizgiyi ondan önce değiştirmeniz gerekmez. Bu Python ile ilgili harika şeylerden biri: saflık üzerindeki pratiklik.
Ned Batchelder

2
Ayrıca, bu cevap sorulan soruya değinmez.
RKD314
Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.