Czy okrężnica w blokach pytona jest technicznie konieczna?

19

To jest naprawdę tylko teoretyczne pytanie pytającego początkującego, który chce zrozumieć więcej.

Wciąż zapominam dwukropek po początkowych instrukcjach bloku w pythonie. Oto, co mam na myśli:

  • for <variable> in <sequence>:
  • if <blah blah>:

Myślę, że jednym z powodów, o których ciągle zapominam, jest fakt, że są one w rzeczywistości ukryte: dwukropek czy nie, oświadczenie kończy się tą linią.

Moje pytanie - które zadaję, aby dowiedzieć się, jak działa składnia Pythona - brzmi: czy dwukropek jest naprawdę niepotrzebny? Czy miałbym zmienić składnię Pythona, aby dwukropek nie był już potrzebny, czy coś się zepsuje? Czy spowodowałoby to, że niektóre stwierdzenia byłyby dwuznaczne lub niemożliwe?

Tomáš Zato - Przywróć Monikę
źródło
4
Myślę, że nie rozumiesz pytania, które brzmi: czy dwukropki są niezbędne do działania składni. Niezależnie od tego, jaka jest twoja odpowiedź, powinna również zawierać wyjaśnienie.
Tomáš Zato - Przywróć Monikę
Prawdopodobnie, czy możesz przeformułować części pytania, aby móc skorzystać z twojego wglądu w tę kwestię, a może przykład? Byłbyś najlepszym sędzią, myślę, że nie mam pojęcia o twoim zamiarze pytania. Czy masz na myśli to na poziomie parsera interpretera / kompilatora? Wielkie dzięki.
bhan sur
Nie wiem, jak to lepiej sformułować. Moje pytanie jest w zasadzie, jeśli można zmienić wszystkie składni Pythona tak, że nie potrzebuje już po dwukropku if, else, whilei tak dalej. Gdybyś to zrobił, czy Python nadal byłby językiem, którego można używać bez dwuznaczności?
Tomáš Zato - Przywróć Monikę
Rozumiem! Jest to pytanie dotyczące decyzji dotyczących projektowania składni Pythona . Przepraszam, źle to zrozumiałem. Dziękuję za wyjaśnienie.
bhan sur
Spekulacje To tak, jakby przerwania linii były trudniejsze do wykrycia przez tłumaczy / analizatory składni w praktyce lub czy są one dostępne dla zapewnienia czytelności. W LUA możesz pisać if .. then .. endw jednym wierszu. Więc tutaj w pythonie thenzastąpiono dwie rzeczy :ai wymaganą nową linię. Jeden z nich wydaje się zbędny.
bhan sur

Odpowiedzi:

9

Tak, dwukropek jest wymagany do ujednoznacznienia niektórych konstrukcji. Rozważmy na przykład if x - y < z: pass. Bez dwukropka nie możemy zdecydować, jak to przeanalizować, nie znając kontekstu, czym są x, y i z. if x: -y < z...jest poprawny, jeśli x ma wartość logiczną, w if x - y < z:przeciwnym razie jest poprawny.

Ponieważ bardzo dobrym pomysłem jest, aby język programowania nie wymagał wykonywania aplikacji do momentu kompilacji, aby móc go przeanalizować, dwukropek jest bardzo wymagany. Możesz to upuścić, ale potrzebujesz innych sposobów na ujednoznacznienie.

Phoshi
źródło
1
Czekaj, możesz mieć wypowiedź po dwukropku w tej samej linii? Byłem całkiem pewien, że to niedozwolone.
Tomáš Zato - Przywróć Monikę
1
Jest to dozwolone, ale tylko z późniejszym podziałem linii.
Phoshi
Wciąż trochę zmieszany. Czy to jest dozwolone: if condition: print("Condition passed")\ndozwolone? \nSymbolizuje nową linię po instrukcji print.
Tomáš Zato - Przywróć Monikę
Jasne, po prostu spróbuj.
RemcoGerlich
1
@TomasZato: tak, możesz mieć dowolne stwierdzenia po dwukropku. Natychmiast kończy blok, więc jest to użyteczne głównie, gdy blok jest niewielką wkładką.
Lie Ryan
14

Dwukropek nie jest tak naprawdę konieczny gramatycznie, gdyby Python został zaprojektowany w innym świecie, możliwe jest, że projektant języka nie zdecyduje się wymagać dwukropka. I rzeczywiście, języki takie jak Cobra to robią.

Głównym powodem, dla którego dwukropek jest wymagany w pythonie, jest jego czytelność. Cytat z Python FAQ :

Dlaczego dwukropki są wymagane w instrukcjach if / while / def / class?

Okrężnica jest wymagana przede wszystkim w celu zwiększenia czytelności (jeden z wyników eksperymentalnego języka ABC). Rozważ to:

if a == b
    print(a)

przeciw

if a == b:
    print(a)

Zauważ, że drugi jest nieco łatwiejszy do odczytania. Zwróć też uwagę, jak dwukropek przedstawia przykład w tej odpowiedzi na najczęściej zadawane pytania; to standardowe użycie w języku angielskim.

Innym drobnym powodem jest to, że dwukropek ułatwia edytorom podświetlanie składni; mogą szukać dwukropków, aby zdecydować, kiedy należy zwiększyć wcięcie, zamiast konieczności bardziej szczegółowego analizowania tekstu programu.

Jak wspomniano również w często zadawanych pytaniach, dwukropek ułatwia także przetwarzanie kodu Pythona bez pełnego parsowania języka. Dowolny procesor tekstowy z pełnoprawnym analizatorem składni, w tym kompilator Pythona, może obejść się bez dwukropka, jeśli nie byłby wymagany lub jeśli stał się opcjonalny, gdy był jednoznaczny.

Lie Ryan
źródło
4
„Zauważ, że drugi jest nieco łatwiejszy do odczytania.” Uważam, że pierwszy jest łatwiejszy do odczytania. Mniej hałasu.
user76284
10

Nie jest to konieczne dla komputera, ale dla ludzi.

Guido van Rossum (twórca Pythona) prowadził przez pewien czas blog o historii Pythona. Okrężnica została wprowadzona w ABC , źródle wielu funkcji Pythona.

W tym poście na blogu „Karin Dewar, Wcięcie i dwukropek” Guido pisze:

I tutaj parafrazuję na prośbę Lamberta.

W 1978 r., Podczas sesji projektowej w dworku w Jabłonnej (Polska), Robert Dewar, Peter King, Jack Schwartz i Lambert porównali różne alternatywne proponowane składnie dla B, porównując (błędne) implementacje sortowania bąbelkowego zapisane w każdej alternatywie. Ponieważ nie mogli się zgodzić, żona Roberta Dewara została wezwana ze swojego pokoju i poprosiła o opinię, jak współczesny Paryż poprosił o porównanie piękna Hery, Ateny i Afrodyty. Ale po tym, jak wyjaśniono jej pierwszą wersję, powiedziała: „Masz na myśli, w wierszu, w którym jest napisane:„ FOR i ... ”, że należy to zrobić dla następnych wierszy; nie tylko dla tego wiersza? ! ” I tutaj naukowcy zdali sobie sprawę, że nieporozumienia można by uniknąć, gdyby na końcu tej linii był dwukropek.

( B tutaj to seria prototypowych języków B0, B1, ... które doprowadziły do ​​ABC. To nie język B jest poprzednikiem C).

Pamiętam też Guido, który w latach 90. zwrócił uwagę, że to z korzyścią dla redaktorów , którzy mogą automatycznie wstawić wcięcie po linii kończącej się dwukropkiem. Ale nie znalazłem jeszcze źródła tego.

RemcoGerlich
źródło
4

Cobra język programowania jest składnia jest mocno inspirowana przez Pythona, a to eliminuje okrężnicy, więc wydaje się, że nie jest to bezwzględnie konieczne. Jednak nie wystarczy po prostu usunąć ten dwukropek, istnieją inne zmiany w składni potrzebne. Zobacz na przykład ten fragment kodu z jednego z moich projektów zabawek :

kons  = lambda hd, tl: lambda x: hd if x else tl
virst = lambda l: l(True )
rrest = lambda l: l(False)

Bez dwukropka oddzielającego ciało od listy parametrów musiałbym użyć wcięcia:

kons  = lambda hd, tl
    lambda x
        hd if x else tl

virst = lambda l
    l(True )

rrest = lambda l
    l(False)

Wierzę, że wcześniejsze wersje Cobry włączały dwukropek jako opcjonalny, można użyć wcięcia, dwukropka lub obu. Podobnie jak w Ruby, gdzie istnieją słowa kluczowe do oddzielenia różnych części wyrażeń kontrolnych, ale można także użyć separatorów wyrażeń (średnik lub nowa linia):

# idiomatic
while true do puts "I am awesome" end
#          ↑↑

# non-idiomatic, but legal
while true; puts "I am awesome" end
#         ↑

# non-idiomatic, but legal
while true
puts "I am awesome" end

# idiomatic
while true
  puts "I am awesome"
end

W aktualnych wersjach Cobry możesz użyć przecinka:

if x
    y

można zapisać jako

if x, y

W przeglądarce musi być jakiś sposób na oddzielenie różnych części wyrażeń kontrolnych lub definicji. W Pythonie jest to dwukropek. Jeśli usuniesz dwukropek, musisz go zastąpić czymś innym, np. Wymuszonym wcięciem. Tylko usunięcie jelita grubego nie będzie działać.

Jedynym sposobem, aby być absolutnie pewnym, jest sformalizowanie składni z dwukropkiem i bez niego oraz udowodnienie jego niejednoznaczności.

Zauważ jednak, że jednym z aforyzmów Zen Pythona jest: „Jawne jest lepsze niż niejawne”, więc wyraźne określenie bloków dwukropkami wydaje się pasować do ogólnej filozofii Pythona. Projektowanie i Historia FAQ wspomina również, że decyzja ta jest oparta na dowodach empirycznych od poprzednika Pythona, ABC.

Jörg W Mittag
źródło
3
Cóż, z tą filozofią opisaną w ostatnim akapicie, możesz wymagać dwukropka na końcu każdej linii. Jawne vs niejawne ma sens tylko wtedy, gdy jawne faktycznie dodaje informacje (np. Niejawny wariant jest niejednoznaczny). Co było celem mojego pytania.
Tomáš Zato - Przywróć Monikę