วิธีที่เหมาะสมในการจัดรูปแบบ dict หลายบรรทัดใน Python คืออะไร?


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 dicts ที่ต้องการ มันคืออะไร?

หมายเหตุ: นี่ไม่ใช่ปัญหาของไวยากรณ์ จากทั้งหมดที่กล่าวมาเป็นคำสั่ง Python ที่ถูกต้อง (เท่าที่ฉันรู้) และเทียบเท่ากัน


12
สำหรับ 1 และ 2: ไม่มีช่องว่างด้านในวงเล็บปีกกาโดยตรงดู PEP 8
Sven Marnach

3
ฉันอยากจะบอกว่าในโมดูล pythons มันใช้ตัวอย่างแรกของคุณโดยไม่มีช่องว่างด้านในของเครื่องมือจัดฟัน
charmoniumQ

คำตอบ:


239

ฉันใช้ # 3 เช่นเดียวกับรายการยาว tuples ฯลฯ ไม่จำเป็นต้องเพิ่มช่องว่างเพิ่มเติมนอกเหนือจากการเยื้อง และเช่นเคยมีความสอดคล้อง

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
Trufa

3
ฮ่า ๆ อย่างจริงจังฉันไม่สามารถหาการอ้างอิง "เผด็จการ" อย่างใดอย่างหนึ่ง ฉันจะบอกให้คุณรู้ถ้าฉันทำ! บางทีบางคนควรติดต่อ Guido
FogleBird

2
แมตช์นี้ PEP 8: python.org/dev/peps/pep-0008/#indentation มีตัวอย่างรายการบางส่วนที่ด้านล่างของส่วนการเยื้อง
ams

31

ก่อนอื่นอย่าง Steven Rumbalski กล่าวว่า "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 ปีแล้ว
Joshua K

อ้าขอบคุณ เรามีอายุประสบการณ์และ "ไมล์สะสม" ที่คล้ายคลึงกันในแง่ของการเขียนโปรแกรม ดังนั้นหากคุณเริ่มฝึกการแสดงความคิดเห็นแบบอินไลน์เมื่อ 20 ปีที่แล้ว (ซึ่งน่าประทับใจมาก!) ทำไมคุณยังต้องการคำอธิบายของอาจารย์ในช่วง 10 ปีที่ผ่านมาเมื่อคุณอยู่ในมหาวิทยาลัย? แค่สงสัย. :-)
RayLuo

คำถามที่ดีมาก :) ATARI BASIC และ GWbasic บังคับให้จริงแล้วเป็นคอมไพเลอร์ที่ใช้สายการไหลจากบนลงล่าง มันเป็นสิ่งที่ฉันนำมาใช้เมื่อฉันอ่าน BASIC ของนอร์ตัน (และรหัส ASM ในภายหลัง) ในนิตยสารกระดาษ ฉันเรียน Turbo Pascal ระหว่างนั้น แต่ฉันได้เรียนรู้จากตัวอย่างในนิตยสารกระดาษและสอดคล้องกับข้อ จำกัด ของ BASIC
Joshua K

PEP8 พูดถึงเรื่องนี้เนื่องจากแนะนำให้เพิ่มช่องว่างทันทีหลังจากวงเล็บเปิดดังนั้นตัวเลือก 1 และ 2 ใน OP จะหมด
Daniel Serodio

9

เนื่องจากคีย์ของคุณเป็นสตริงและเนื่องจากเรากำลังพูดถึงการอ่านได้ฉันชอบ:

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

6
ไม่ต้องการใช้ช่องว่างเมื่อกำหนด kwargs c = function(a=1, b=2)เป็น "pythonic" มากกว่า
Steve K

1

โดยปกติถ้าคุณมีวัตถุหลามขนาดใหญ่มันค่อนข้างยากที่จะจัดรูปแบบ โดยส่วนตัวฉันชอบใช้เครื่องมือบางอย่างสำหรับเรื่องนี้

นี่คือ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
No! รวมเครื่องหมายจุลภาคสุดท้ายเสมอดังนั้นหากคุณเพิ่มองค์ประกอบสุดท้ายใหม่คุณไม่จำเป็นต้องเปลี่ยนบรรทัดก่อนหน้า นี่คือหนึ่งในสิ่งที่ยอดเยี่ยมเกี่ยวกับ Python: การปฏิบัติจริงมากกว่าความบริสุทธิ์
Ned Batchelder

2
นอกจากนี้คำตอบนี้ไม่ได้ตอบคำถามที่ถาม
RKD314
โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.