목록에 후행 쉼표가 허용되는 이유는 무엇입니까?


135

파이썬에서 왜 목록의 후행 쉼표가 유효한 구문인지 궁금하고 파이썬이 단순히 그것을 무시하는 것처럼 보입니다.

>>> ['a','b',]
['a', 'b']

그것은 의미가 때 자사의 튜플 이후 ('a')('a',)다른 두 가지이지만, 목록에있는?



7
C, C ++, Java, JavaScript 등의 목록에는 후행 쉼표도 사용할 수 있습니다.
Nayuki

답변:


223

주요 이점은 여러 줄 목록을 쉽게 편집 할 수있게하고 난이도를 정리하는 것입니다.

바꾸다:

s = ['manny',
     'mo',
     'jack',
]

에:

s = ['manny',
     'mo',
     'jack',
     'roger',
]

diff의 한 줄 변경 만 포함합니다.

  s = ['manny',
       'mo',
       'jack',
+      'roger',
  ]

후행 쉼표를 생략하면 더 혼란스러운 여러 줄 diff를 이깁니다.

  s = ['manny',
       'mo',
-      'jack'
+      'jack',
+      'roger'
  ]

후자의 diff는 한 줄만 추가되었고 다른 줄은 내용을 변경하지 않았 음을 확인하기 어렵게 만듭니다.

또한 이렇게 할 위험을 줄입니다.

s = ['manny',
     'mo',
     'jack'
     'roger'  # Added this line, but forgot to add a comma on the previous line
]

암시 적 문자열 리터럴 연결을 트리거 s = ['manny', 'mo', 'jackroger']하여 의도 한 결과 대신 생성 합니다.


6
이것은 (가장) 의미가 있지만, 언어 파서가 diff를 더 쉽게 만들 수 있도록 설계되어 있다면 정말 놀랄 것입니다.
Burhan Khalid

94
@ BurhanKhalid : 언어 디자이너는 프로그래머이며, 프로그래머는 삶을 편하게하기 위해 많은 일을합니다.
Greg Hewgill

10
@Burhan 만약 당신이 그 설명을 믿지 않는다면, 그 방법으로 문법을 정의하는 것이 더 간단합니까? ;) 비교 List = "[" {Item ","} "]".vs.List = "[" ({Item","}Item|)"]".
Voo

23
또한 다른 프로그램이 코드를 자동 생성하는 것이 더 쉬워집니다. "\"item\","각 항목을 인쇄 "\"item\""한 다음 ","마지막 항목을 제외한 모든 항목 을 인쇄 하는 것보다 각 항목을 인쇄 하는 것이 훨씬 쉽습니다 .
Adam Rosenfield 2016 년

9
@Voo 나도 같은 생각을했지만 후자의 문법은 여전히 ​​유효한 Python 목록이기 때문에 어쨌든 정의해야합니다.
Alexander Suraphel

34

배열에서 후행 쉼표를 허용하는 일반적인 구문 규칙이며 C 및 Java와 같은 언어는 허용하며 Python은 목록 데이터 구조에이 규칙을 채택한 것으로 보입니다. 목록을 채울 코드를 생성 할 때 특히 유용합니다. 요소와 쉼표 시퀀스를 생성하기 만하면 마지막에 쉼표가 없어야하는 특수한 경우로 간주 할 필요가 없습니다.


30

특정 종류의 버그를 제거하는 데 도움이됩니다. 여러 줄에 목록을 작성하는 것이 더 분명한 경우가 있습니다. 그러나 나중에 유지 관리하면 항목을 다시 정렬 할 수 있습니다.

l1 = [
        1,
        2,
        3,
        4,
        5
]

# Now you want to rearrange

l1 = [
        1,
        2,
        3,
        5
        4,
]

# Now you have an error

그러나 후행 쉼표를 허용하고 사용하면 오류없이 줄을 쉽게 재정렬 할 수 있습니다.


1
이것은 깔끔하지만 쉼표를 앞에 붙여서 피할 수 있습니다. SQL을 작성할 때 항상 그렇게합니다
Burhan Khalid

38
각 요소 앞에 쉼표를 붙여도 첫 번째 요소에는 쉼표를 생략해야합니다.
Greg Hewgill

린 터는 이것을 잡을 수 있어야합니다.
viki.omega9 2016

6

튜플은 ('a')암시 적 연속 및 ()s를 선행 연산자로 사용하여 확장 되는 반면 ('a',)길이 1 튜플을 참조 하므로 다릅니다 .

원래 예는 tuple('a')


('a'),문자열입니다. 그러나 내 요점은 튜플의 후행 쉼표가 중요하지만 목록에서 아직 파이썬이 허용하지 않는 것으로 보입니다.
Burhan Khalid

1
두 경우 모두 조용히 버려집니다. 터플에서는 괄호 안의 문자열과 구별해야합니다.
richo

tuple('a')일반적으로하기 때문에, 아마 나쁜 예이다 tuple(x)(x,)같은 것이 아니다. tuple('ab') != ('ab',). 길이가 1 인 문자열 tuple('a') == ('a',)이기 때문에 'a'.
chepner

REPL : >>> ("a",) == ("a") False >>> ("ab",) == ("ab") False >>> ("ab", "bc",) == ("ab", "bc") True
Seraphya

1

주된 이유는 diff를 덜 복잡하게 만드는 것입니다. 예를 들어 목록이 있습니다.

list = [
    'a',
    'b',
    'c'
]

다른 요소를 추가하고 싶습니다. 그런 다음이 작업을 수행하게됩니다.

list = [
    'a',
    'b',
    'c',
    'd'
]

따라서 diff는 두 줄이 바뀌 었음을 보여줍니다. 먼저 'c'와 함께 ','를 추가하고 마지막 줄에서 'd'를 추가합니다.

따라서 파이썬은 혼란을 유발할 수있는 여분의 diff를 방지하기 위해 목록의 마지막 요소에서 ','뒤에 오는 것을 허용합니다.

당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.