Cách thích hợp để định dạng một dict nhiều dòng trong Python là gì?


184

Trong Python, tôi muốn viết một dict nhiều dòng trong mã của tôi. Có một vài cách người ta có thể định dạng nó. Dưới đây là một vài điều mà tôi có thể nghĩ ra:

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

Tôi biết rằng bất kỳ điều nào ở trên đều đúng về mặt cú pháp, nhưng tôi cho rằng có một kiểu thụt đầu dòng và kiểu ngắt dòng ưa thích cho các ký tự Python. Nó là gì?

Lưu ý: Đây không phải là vấn đề cú pháp. Tất cả những điều trên là (theo như tôi biết) các câu lệnh Python hợp lệ và tương đương với nhau.


12
Dành cho 1 và 2: Không có khoảng trắng trực tiếp bên trong niềng răng, xem PEP 8.
Sven Marnach

3
Tôi muốn nói rằng trong mô-đun pprint pythons, nó sử dụng ví dụ đầu tiên của bạn, không có khoảng trắng trực tiếp bên trong dấu ngoặc nhọn.
charmoniumQ

Câu trả lời:


239

Tôi sử dụng số 3. Tương tự cho các danh sách dài, bộ dữ liệu, v.v. Nó không yêu cầu thêm bất kỳ khoảng trắng nào ngoài các vết lõm. Như mọi khi, hãy kiên định.

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

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

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

Tương tự, đây là cách ưa thích của tôi bao gồm các chuỗi lớn mà không giới thiệu bất kỳ khoảng trắng nào (như bạn sẽ nhận được nếu bạn sử dụng chuỗi nhiều dòng được trích dẫn ba lần):

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

Bạn có thể bao gồm một số tài liệu tham khảo, tôi gặp khó khăn khi tìm một nguồn có thẩm quyền về điều này. (Tôi đồng ý với bạn).
Trufa

82
Hmm, tôi đã tìm thấy cái này: stackoverflow.com/questions/6388187/ từ
FogleBird

6
Đừng nói với anh ta nhưng người dùng đó không biết anh ta đang nói về cái gì; P
Trufa

3
lol, nghiêm túc hơn, tôi cũng không thể tìm thấy một tài liệu tham khảo "có thẩm quyền". Tôi sẽ cho bạn biết nếu tôi làm! Có lẽ ai đó nên liên hệ với Guido.
FogleBird

2
Điều này khớp với PEP 8: python.org/dev/peps/pep-0008/#indentation . Có một số ví dụ danh sách ở dưới cùng của phần thụt đầu dòng.
AMS

31

Trước hết, như Steven Rumbalski nói, "PEP8 không giải quyết câu hỏi này", vì vậy đây là vấn đề sở thích cá nhân.

Tôi sẽ sử dụng một định dạng tương tự nhưng không giống với định dạng của bạn 3. Đây là của tôi và tại sao.

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

tôi thích bình luận trong dòng giáo sư lập trình đầu tiên của tôi (tôi đã lập trình từ nhiều năm trước) nhấn mạnh vào các bình luận nội tuyến, nhưng không bao giờ giải thích hiệu quả tại sao. Bây giờ bạn đã giải thích một thực hành tôi đã sử dụng trong khoảng 20 năm.
Joshua K

Aha, cảm ơn. Chúng tôi có độ tuổi, kinh nghiệm và "số dặm" ​​tương tự về mặt lập trình. Vì vậy, nếu bạn đã bắt đầu thực hành bình luận nội tuyến 20 năm trước (rất ấn tượng!), Tại sao bạn vẫn cần lời giải thích của giáo sư về nó trong khoảng 10 năm trước khi bạn ở trường đại học? Chỉ tò mò thôi. :-)
RayLuo

câu hỏi rất hay :) ATari BASIC và GWbasic thực tế đã buộc nó, là trình biên dịch dựa trên dòng chảy từ trên xuống. đó là một cái gì đó tôi đã thông qua khi tôi đọc BASIC của peter norton (và sau đó là mã ASM) trên các tạp chí giấy. tôi đã học Turbo Pascal ở giữa, nhưng tôi đã học được từ các ví dụ trên tạp chí giấy và tuân thủ các giới hạn của BASIC.
Joshua K

PEP8 phần nào giải quyết vấn đề này vì nó khuyến nghị không nên thêm khoảng trắng ngay sau khi mở nẹp, do đó, các tùy chọn 1 và 2 trong OP đã hết.
Daniel Serodio

9

Vì các khóa của bạn là các chuỗi và vì chúng ta đang nói về khả năng đọc, tôi thích:

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

6
Không thích sử dụng khoảng trắng khi xác định kwargs. c = function(a=1, b=2)là "pythonic" hơn.
Steve K

1

Thông thường, nếu bạn có các đối tượng trăn lớn, việc định dạng chúng khá khó khăn. Cá nhân tôi thích sử dụng một số công cụ cho việc đó.

Đây là python-beautifier - www.cleancss.com/python-beautify giúp ngay lập tức biến dữ liệu của bạn thành kiểu có thể tùy chỉnh.


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

Điều này không trả lời câu hỏi
bagerard

-1

Từ kinh nghiệm của tôi với hướng dẫn, và những thứ khác, số 2 dường như luôn được ưa thích, nhưng đó là lựa chọn sở thích cá nhân hơn bất kỳ thứ gì khác.


-6

Nói chung, bạn sẽ không bao gồm dấu phẩy sau mục cuối cùng, nhưng Python sẽ sửa lỗi đó cho bạn.


34
Không! Luôn bao gồm dấu phẩy cuối cùng, vì vậy nếu bạn thêm một yếu tố cuối cùng mới, bạn không phải thay đổi dòng trước nó. Đây là một trong những điều tuyệt vời về Python: tính thực tế trên độ tinh khiết.
Ned Batchelder

2
Ngoài ra, câu trả lời này không giải quyết câu hỏi được hỏi.
RKD314
Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.