2012-09-07 13 views
20

Jeśli spojrzeć na kod bajtowy Pythona skompilowany z modułami, zobaczysz na końcu:Python: dlaczego `nie return` dozwolone w module

10 LOAD_CONST    0 (None) 
13 RETURN_VALUE   

Tj a return jest całkowicie poprawny na poziomie katalogu głównego modułu. Jeśli jednak spróbujesz użyć go w kodzie źródłowym, otrzymasz:

SyntaxError: 'return' outside function 

Dlaczego?


Jest to oczywiście decyzja dotycząca projektowania języka. Ale dlaczego zostało to zrobione? A return jest często bardzo przydatny w module. Na przykład. I czasami chce napisać ten kod na początku modułu:

import sys 
if sys.platform != "linux2": 
    print "your platform is not yet supported" 
    # define some stubs 
    def foo(): pass 
    def bar(): pass 
    return 

I nie chcą podnieść wyjątek tam (bo to spowodowałoby nie moduł ładowania, który nie chcę).


Właściwie hacked razem jakiś kod, który może manipulować kodu bajtowego Pythona w locie i po prostu zrobić zwrot (lub w moim przypadku skoku do końca gdzie zwrot jest zrobione). To działa. Jedynym powodem, dla którego jest to tylko CPython, jest brak standardowego sposobu manipulowania obiektem kodu.

Here to kod.


Dla możliwych odpowiedzi: wolałbym prawdziwe dowody, niektóre przeszłe oświadczenia Guido van Rossum i tak o tym nie tyle byle random dyskusja. Oczywiście mogę to objąć zarówno zaletami (jak już przedstawiono), jak i wadami, ale tak naprawdę nie widzę wielkiego powodu przeciwko niemu.

+2

dlaczego nie podnosisz wyjątku? to zatrzyma wykonanie i zwróci informację o tym, dlaczego od rozmówcy zależy słuchanie wyjątku. –

+1

@JoranBeasley: Nie załaduje modułu. Mówię o przypadkach, w których nadal chcę załadować moduł. – Albert

+1

następnie oddzielny moduł, który użytkownik może zaimportować ... jeśli nie jest obsługiwany, nie powinien być obsługiwany ... w '__init __. Py' możesz zrobić' try: import no_linux2; z wyjątkiem: import alt_implementation jako no_linux2' –

Odpowiedz

6

Domyślam się, że jest to decyzja ze strony deweloperów Pythona, ponieważ zmusza ona moduł do radzenia sobie z faktem, że jego system nie jest obsługiwany (zamiast pozyskiwania programistów z modułu odgadnąć, co powinno się stać). Wyobraźmy sobie ich zaskoczenie, kiedy uruchamiają kod na komputerze z systemem Windows i nagle nie działa tak, jak się spodziewali. (Twoje ostrzeżenie print można całkowicie zakopać we wszystkich innych odpadkach, które mogą zostać zrzucone na standardowe wyjście).

Myślę, że najbardziej idiotycznym sposobem na poradzenie sobie z tym jest podniesienie ImportError lub NotImplementedError. Następnie użytkownik może zdecydować, czy może żyć bez tego modułu i kontynuować, (przechwytując wyjątki) lub jeśli ich program powinien się zawiesić i wypalić.

+1

Nie mogę wymyślić jednego ważnego powodu, dla którego ktoś chciałby wywołać zwrot z modułu ... –

+0

To dość nietypowe dla Pythona, który zwykle nie działa dużo (dużo przeciwnie). – Albert

+0

@Albert - to też nie * wymusza * tego. Możesz swobodnie zamknąć cały moduł w klauzuli "if-elif-else", jeśli masz na to ochotę. Dla małego modułu (jak mówisz), może to być opcja ... – mgilson

Powiązane problemy