Wartości zwracane w procedurze Pythona [zamknięte]
W Pythonie można utworzyć procedurę, która nie ma wyraźnego powrotu. to znaczy.:
def test(val):
if 0 == val:
return 8
Ponadto możliwe jestprzydzielać wyniki tej funkcji dla zmiennej:
>>> a = test(7)
>>> print `a`
'None'
Dlaczego do cholery to jest? Jaka logika językowa kryje się za tą zaskakującą decyzją projektową? Dlaczego nie powoduje to błędu kompilatora?
EDYCJA: Tak, zdaję sobie sprawę, że tak działa. Dzięki. Moje pytanie brzmi: DLACZEGO? Wygląda na taki pewny sposób na wprowadzenie subtelnych błędów do kodu. I wydaje się, jak wspomniano poniżej, e-satis, aby przeciwstawić się bardzo mądremu pytonicznemu powiedzeniu, że „wyraźne jest lepsze niż ukryte”.
Więc o co chodzi? Czy to tylko nadzór projektowy, czy upraszczające założenie, czy celowa, przemyślana decyzja?
EDIT: Czy wszyscy zgodziliby się, że wyrażanie intencji w ten sposób jest o wiele lepsze:
def test(val):
if 0 == val:
return 8
else:
return None
Jeśli tak, to dlaczego Python wolałby, aby poprzedni styl miał wyjątek czasu kompilacji?
EDYCJA: S.Lott wyraźnie wskazuje ten punkt (a inni robią to samo, jego po prostu wydaje mi się jasne), że to zachowanie wynika z faktu, że Python jest językiem dynamicznym i dlatego nie może sprawdzić w czasie kompilacji zachowanie systemu w czasie wykonywania.
Ponieważ nie ma rozróżnienia między procedurami (te funkcje, które nie zwracają żadnych wartości) i funkcjami (tymi, które to robią), nie ma nic do wymuszenia w czasie kompilacji. Oznacza to, że kiedy dochodzimy do zachowania w czasie wykonywania, albo w niektórych przypadkach mamy katastrofalną awarię (rzucamy wyjątek), albo po cichu nie udaje się, że programista wiedział, co robi i zrozumiał domyślne zachowanie.
Pythonicznym sposobem jest zrobić to drugie, sposób w stylu C ma zrobić pierwszy.
Wydaje się to mieć sens jako dobry powód, aby to zrobić w ten sposób.
Jasne uzasadnienie S.Lotta jest ukryte w komentarzach do zaakceptowanej odpowiedzi, więc pomyślałem, że najlepiej będzie tutaj podsumować.
Będę wstrzymywał się z zaakceptowaniem odpowiedzi przez chwilę, aby sprawdzić, czy S.Lott udzieli oficjalnej odpowiedzi. W przeciwnym razie dam punkty SilentGhost.