튜플 정의에서 후행 쉼표를 사용하는 구문 규칙은 무엇입니까?


119

단일 요소 튜플의 경우 후행 쉼표가 필요합니다.

a = ('foo',)

여러 요소가있는 튜플은 어떻습니까? 후행 쉼표가 있는지 여부에 관계없이 둘 다 유효한 것 같습니다. 이 올바른지? 후행 쉼표를 사용하면 편집하기가 더 쉽습니다. 그게 나쁜 코딩 스타일인가요?

a = ('foo1', 'foo2')
b = ('foo1', 'foo2',)

답변:


73

빈 튜플을 제외한 모든 경우에 쉼표가 중요합니다. 괄호는 다른 구문상의 이유로 필요한 경우에만 필요합니다. 즉, 튜플을 함수 인수 집합, 연산자 우선 순위에서 구별하거나 줄 바꿈을 허용하기 위해 필요합니다.

튜플, 목록 또는 함수 인수의 후행 쉼표는 특히 여러 줄로 분할 된 긴 초기화가있는 경우 좋은 스타일입니다. 항상 후행 쉼표를 포함하면 다른 요소를 추가하고 대신 유효한 표현식을 생성하기 위해 끝에 다른 줄을 추가하지 않습니다.

a = [
   "a",
   "b"
   "c"
]

나중에 확장 된 2 개 요소 목록으로 시작되었다고 가정하면 즉시 명백하지 않은 방식으로 잘못되었습니다. 항상 후행 쉼표를 포함하고 그 함정을 피하십시오.


3
위에서 언급 한 이유 때문에 쉼표를 그대로 두는 것이 유리할 수 있습니다. 반면에이 습관을 채택하면 애플리케이션의 다른 곳에서도 JavaScript 또는 JSON을 처리하는 경우 골칫거리가 될 수 있습니다. 일부 브라우저는이를 좋아하지 않기 때문입니다.
Cito 2011

7
예,하지만 손으로 ​​JSON을 구성해서는 안되며, 이는 중요하지 않으며 Javascript의 경우 항상 jslint 또는 이와 동등한 오류를 사용하여 브라우저에 가까워지기 전에 이러한 종류의 오류를 포착합니다.
Duncan 2011

100

단일 항목 튜플이 튜플 또는 괄호로 둘러싸인 표현식을 정의하는 것을 명확하게하는 데만 필요합니다.

(1)  # the number 1 (the parentheses are wrapping the expression `1`)
(1,) # a 1-tuple holding a number 1

둘 이상의 항목의 경우 튜플이라는 것이 완벽하게 명확하므로 더 이상 필요하지 않습니다. 그러나 후행 쉼표를 사용하면 여러 줄을 사용하여 쉽게 정의 할 수 있습니다. 실수로 쉼표를 생략했기 때문에 구문을 깨지 않고 항목을 끝에 추가하거나 다시 정렬 할 수 있습니다.

예 :

someBigTuple = (
                   0,
                   1,
                   2,
                   3,
                   4,
                   5,
                   6,
                   7,
                   8,
                   9,
                   10,
                   #...
                   10000000000,
               )

이는 튜플뿐만 아니라 다른 컬렉션 (예 : 목록 및 사전)에도 적용됩니다.


5
이것은 튜플이 아닌 다른 것들에도 유효 함을 지적하기 위해 +1합니다. 이것은 한 key: value,줄에 하나씩 사용하는 데 유용하며 새 항목을 추가 할 때 쉼표를 처리하지 않습니다.
Joël 2011

46

후행 쉼표의 또 다른 장점은 diff를 더 멋지게 보이게한다는 것입니다. 당신이 시작했다면

a = [
    1,
    2,
    3
]

그리고 그것을

a = [
    1,
    2,
    3,
    4
]

diff는 다음과 같습니다.

 a = [
     1,
     2,
-    3
+    3,
+    4
 ]

후행 쉼표로 시작했다면

a = [
    1,
    2,
    3,
]

그런 다음 diff는

 a = [
     1,
     2,
     3,
+    4,
 ]

이것은 원래 질문에 대한 답변 이라기보다는 주석에 가깝지만 후행 쉼표를 선호하는 추가 인수가 정말 마음에 듭니다.
Mad Physicist


8

또한 원하는 상황을 고려하십시오.

>>> (('x','y'))*4                         # same as ('x','y')*4
('x', 'y', 'x', 'y', 'x', 'y', 'x', 'y')
#Expected = (('x', 'y'), ('x', 'y'), ('x', 'y'), ('x', 'y'))

따라서이 경우 외부 괄호는 그룹화 괄호에 지나지 않습니다. 튜플을 만들려면 뒤에 쉼표를 추가해야합니다. 즉

>>> (('x','y'),)*4 
(('x', 'y'), ('x', 'y'), ('x', 'y'), ('x', 'y'))

6

후행 쉼표는 요소가 하나 인 튜플에만 필요합니다. 더 큰 튜플에 대해 후행 쉼표를 사용하는 것은 스타일의 문제이며 필수는 아닙니다. 가장 큰 장점은 자주 수정되는 여러 줄의 대형 튜플 (예 : 구성 튜플)이있는 파일에 대한 명확한 차이입니다.


6

그것은 간단한 대답입니다.

a = ( "s")는 문자열입니다.

a = ( "s",)는 하나의 요소가있는 튜플입니다.

파이썬은 문자열과 튜플을 구별하기 위해 하나의 요소 튜플의 경우 추가 쉼표가 필요합니다.

예를 들어 파이썬 콘솔에서 이것을 시도하십시오.

a = ( "s")

a = a + (1,2,3)

역 추적 (가장 최근 호출 마지막) :

모듈의 파일 stdin, 라인 1

TypeError : 'str'및 'tuple'개체를 연결할 수 없습니다.


4

이것이 존재하는 또 다른 이유는 코드 생성과 __repr__함수를 더 쉽게 작성할 수 있기 때문입니다. 당신이 좋아 내장되어 일부 개체가있는 경우 예를 들어 obj(arg1, arg2, ..., argn), 당신은 쓸 수 obj.__repr__

def __repr__(self):
    l = ['obj(']
    for arg in obj.args: # Suppose obj.args == (arg1, arg2, ..., argn)
        l.append(repr(arg))
        l.append(', ')
    l.append(')')
    return ''.join(l)

후행 쉼표가 허용되지 않는 경우 마지막 인수를 특수하게 사용해야합니다. 사실, 목록 이해력을 사용하여 위의 내용을 한 줄로 작성할 수 있습니다 (읽기 쉽도록 더 길게 작성했습니다). 마지막 학기에 특별한 경우가 있었다면 그렇게하는 것이 그렇게 쉽지 않을 것입니다.


2
마지막 인수를 특수하게 사용할 필요가 없습니다 . join이 경우 에만 사용할 수 있습니다 def __repr__(self): 'obj(' + ', '.join([repr(arg) for arg in obj.args]) + ')'..
Suzanne Dupéron 2013 년

또한 Python으로 작성되지 않고 .NET과 같은 멋진 기능이없는 도구에서도 코드 생성에 도움이됩니다 join.
asmeurer 2013 년

2

PEP 8-Python 코드 스타일 가이드-후행 쉼표를 사용하는 경우

후행 쉼표는 일반적으로 선택 사항이지만 한 요소의 튜플을 만들 때 필수 사항이라는 점을 제외하면 (파이썬 2에서는 print 문에 대한 의미를 가지고 있습니다). 명확성을 위해 후자를 (기술적으로 중복 된) 괄호로 묶는 것이 좋습니다.

예:

FILES = ('setup.cfg',)

좋아요,하지만 혼란 스럽습니다.

FILES = 'setup.cfg',

후행 쉼표가 중복되는 경우 값, 인수 또는 가져온 항목 목록이 시간이 지남에 따라 확장 될 것으로 예상되는 경우 버전 제어 시스템을 사용할 때 유용합니다. 패턴은 각 값 (등)을 한 줄에 단독으로 놓고 항상 후행 쉼표를 추가하고 다음 줄에 닫는 괄호 / 대괄호 / 중괄호를 추가하는 것입니다. 그러나 닫는 구분 기호와 같은 줄에 후행 쉼표를 사용하는 것은 의미가 없습니다 (위의 싱글 톤 튜플의 경우 제외).

예:

FILES = [
    'setup.cfg',
    'tox.ini',
    ]
initialize(FILES,
           error=True,
           )

아니:

FILES = ['setup.cfg', 'tox.ini',]
initialize(FILES, error=True,)

-5

코딩 스타일이 당신의 취향입니다. 코딩 표준이 중요하다고 생각한다면 PEP-8 이 당신을 안내 할 수 있습니다.

다음 표현의 결과에 대해 어떻게 생각하십니까?

x = (3)
x = (3+2)
x = 2*(3+2)

네, x는 숫자 일뿐입니다.


1
그것은 당신의 생각을 설명하는 잘못된 방법입니다. 명시적인 것이 암시적인 것보다 낫습니다.
Guilherme David da Costa
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.