파이썬에서 여러 줄로 된 dict을 형식화하는 올바른 방법은 무엇입니까?


184

파이썬에서는 코드에 여러 줄로 된 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에 대해 선호되는 들여 쓰기 및 줄 바꿈 스타일이 있다고 가정합니다. 무엇입니까?

참고 : 이것은 구문 문제가 아닙니다. 위의 모든 것은 유효한 파이썬 문장이며 서로 동등합니다.


12
1과 2 : 괄호 안에 직접 공백이
없으면

3
pythons pprint 모듈에서 첫 번째 예제를 사용하고 중괄호 안에 공백이 없어야한다고 말하고 싶습니다.
charmoniumQ

답변:


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
Trufa

3
lol, 더 진지하게, 나는 "권한있는"참조도 찾을 수 없었다. 내가 할 경우 알려 드리겠습니다! 아마도 누군가가 귀도에 연락해야 할 것입니다.
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은 하향식 흐름 라인 기반 컴파일러이기 때문에 실제로 그것을 강제했습니다. 그것은 종이 잡지에서 peter norton의 BASIC (그리고 나중에 ASM 코드)을 읽을 때 내가 채택 한 것입니다. 나는 사이에 터보 파스칼을 배웠지 만, 종이 잡지의 예에서 이미 배웠고 베이직의 한계를 따랐다.
Joshua K

PEP8은 여는 중괄호 바로 뒤에 공백을 추가하지 않도록 권장하므로 OP의 옵션 1 및 2가 빠져 있기 때문에 다소 해결합니다.
Daniel Serodio

9

키는 문자열이므로 가독성에 대해 이야기하고 있기 때문에 선호합니다.

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

6
크워 그를 정의 할 때 공백을 사용하지 않는 것이 좋습니다. c = function(a=1, b=2)더 "pythonic"입니다.
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(",", "")))

이 질문에 대답하지 않습니다
bagerard

-1

튜토리얼에 대한 나의 경험과 다른 것들 2 번은 항상 선호되는 것처럼 보이지만 다른 무엇보다 개인적인 취향 선택입니다.


-6

일반적으로 최종 입력 후 쉼표를 포함시키지 않지만 Python 은이를 수정합니다.


34
아니! 항상 마지막 쉼표를 포함 시키므로 새 마지막 요소를 추가하는 경우 그 전에 줄을 변경할 필요가 없습니다. 이것은 파이썬에 대한 위대한 것 중 하나입니다. 순도보다 실용성.
Ned Batchelder 2016 년

2
또한이 답변은 질문 된 내용을 다루지 않습니다.
RKD314
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.