2013-04-15 17 views
38

Czy istnieje jakieś odniesienie określające dokładnie, kiedy załączanie krotek z nawiasami jest lub nie jest wymagane?Kiedy w krotce są wymagane nawiasy?

Oto przykład, który zaskoczył mnie niedawno:

>>> d = {} 
>>> d[0,] = 'potato' 
>>> if 0, in d: 
    File "<stdin>", line 1 
    if 0, in d: 
     ^
SyntaxError: invalid syntax 
+4

Uważam to szczególnie interesujące, że dla ' k, in d: print k' działa w tym przypadku. –

+0

Gramatyka [gramatyka w języku Python] (http://docs.python.org/2/reference/grammar.html) pokaże ci, jakie * jest * dozwolone, na przykład w instrukcji 'if'.Musisz przeczytać pełną gramatykę, aby dowiedzieć się, gdzie akceptowane są krotki niepreferyzowane, dlatego nie zamieszczam tego jako odpowiedzi. – chepner

+0

... Nie rozumiem, jak mogłeś być zaskoczony * przez '' '' '' '', '... identyfikatory Pythona muszą zaczynać się od litery (unicode) lub podkreślenia, a' 0' nie jest poprawne Pythona, stąd też mógłbym oczekiwać * 'SyntaxError'. – Bakuriu

Odpowiedz

38

Łączenie wyrażeń tworzyć krotki za pomocą tokena przecinkami określany jest jako expression_list. Reguły operator precedence nie obejmują list wyrażeń; dzieje się tak dlatego, że listy wyrażeń nie są same w sobie wyrażeniami; stają się wyrażeniami, gdy są ujęte w nawiasy.

Więc niezawarty expression_list jest dozwolone nigdzie w Pythonie, że jest wyraźnie dozwolone przez gramatykę języka, ale nie gdzie wymagana jest expression jako takie.

Na przykład, gramatyka if statement jest następujący:

if_stmt ::= "if" expression ":" suite 
      ("elif" expression ":" suite)* 
      ["else" ":" suite] 

Ponieważ produkcja expression odwołuje, unenclosed expression_list s nie są akceptowane jako przedmiot rachunku if. Jednak for statement akceptuje expression_list:

for_stmt ::= "for" target_list "in" expression_list ":" suite 
       ["else" ":" suite] 

Więc następujące jest dozwolone: ​​

for x in 1, 2, 3: 
    print(x) 
+2

+1 To z pewnością wyjaśnia, dlaczego' dla k, w d' works (ponieważ działa 'for k, v in d'). –

+0

Pytanie: Należy wpisać "dla x w 1, 2, 3:" lub "dla x w (1, 2, 3):'? Zawsze pisałem to w drugą stronę, ale to dlatego, że nie wiedziałem, że pierwszy sposób jest ważny do chwili obecnej, kiedy próbowałem. Teraz zastanawiam się, czy '()' są niepotrzebnym szumem, czy też w jakiś sposób pomagają w czytaniu kodu. Czy PEP8 zapewnia jakiekolwiek wskazówki w tym zakresie? – ArtOfWarfare

+1

@ArtOfWarfare nie ma konkretnych wskazówek w PEP8. Może to pomóc w porównaniu z instrukcjami "if", w których nawiasy są zalecane tylko dla warunku obejmującego wiele linii. A więc: 'dla x w (1, 2, 3):'. – ecatmur

11

gdziekolwiek jesteś wolno używać terminu expression_list, nie trzeba używać nawiasów.

Wymaga if statement wymaga expression i nie obsługuje expression_list.

Przykłady składni zezwala expression_list:

grepping dokumentację Expressions, Simple i Compound statements dla expression_list powie wszystkie lokalizacje, które jest używane w expression_list gramatyki Pythona.

+0

O tak? Co powiesz na "1,2,3 + 4,5"? Nie powoduje to listy wyrażeń, której możesz się spodziewać ... – smci

+0

@smci co to ma wspólnego z moją odpowiedzią? Jakiego wyniku oczekiwałeś? –

+0

Ponieważ '1,2,3 + 4,5' powoduje wyrażenie" 1,2,7,5 ", co nie jest typowe dla zwykłego czytelnika, i pochodzi z przeciążenia' + 'dla dodania sekwencji. – smci

1

Nawiasy są również wymagane, gdy chcesz , aby uniknąć niejasności.

Poniżej są dwa różne wyrażenia ... tylko dlatego, że coś jest „lista wyrażenie”, nie wynika z listy ekspresji można się spodziewać :)

(1, 2, 3) + (4, 5) # results in (1, 2, 3, 4, 5) because + does sequence.extend on the tuples 
1, 2, 3 + 4, 5  # this results in (1, 2, 7, 5) because + adds the elements, since there were no parentheses to protect the separate tuples 
Powiązane problemy