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


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.