2010-07-02 23 views
9

Mam przyzwyczaił się do funkcji zapisu, które działają tak:Zatrzymaj ocena obrębie modułu

def f(): 
    if sunny: 
    return 
    #do non-sunny stuff 

Próbuję dowiedzieć się równoważną składnię do użycia w module. Chcę zrobić coś takiego:

if sunny: 
    import tshirt 
    #do something here to skip the rest of the file 
import raincoat 
import umbrella 
#continue defining the module for non-sunny conditions 

wiem, że mogę napisać to jako if/else ale wydaje się głupie, aby wciąć całą resztę mojego modułu.

Mogłem przenieść resztę kodu do osobnego modułu i warunkowo go zaimportować, ale to wydaje się bolesne.

+5

Wygląda lik e zadanie dla 'goto': P (http: // entrian.com/goto /) –

Odpowiedz

2

Oddzielne pliki i dodatkowe wcięcia są prawdopodobnie uzasadnione, biorąc pod uwagę, że na początku jest to dziwne.

W zależności od tego, czego faktycznie potrzebujesz, możesz przejść dalej i przetworzyć całą treść modułu, a następnie usunąć wszystko, co nie jest odpowiednie w pewnym momencie później.

def foo(): 
    print "foo" 
def bar(): 
    print "bar" 

if sunny: 
    del foo 
else: 
    del bar 
+0

Problem polega na tym, że "nie-słoneczny" kod to głównie import, który nie działa wewnątrz funkcja i duże bloki importu nie wyglądają dobrze, gdy są mocno wcięte. –

+1

importowanie działa w ramach funkcji. Możesz je "globalnie", jeśli muszą być widoczne na zewnątrz. Ogólnie uważa się, że jest to zła forma, ale działa. – bobince

0

Wcięcie części warunkowej wydaje mi się w porządku. Jeśli jest naprawdę długi - powiedzmy więcej niż jeden ekran lub dwa, prawdopodobnie przeniesie części warunkowe do osobnych plików. Twój kod będzie znacznie łatwiejszy do odczytania.

+0

Tak. Myślę, że przeniesienie kodu do innego pliku jest prawdopodobnie najlepszym sposobem na zrobienie tego. Mały malutki plik warunkowy importujący większy plik ... –

0

Będziesz musiał wgrać swój kod, w ten czy w inny sposób. Najprostszym sposobem jest zdefiniowanie kodu w funkcjach i wywołanie ich. Dzięki temu bloki if/else są uporządkowane.

def do_if_sunny(): 
    pass 

def do_if_rainy(): 
    pass 

if sunny: 
    do_if_sunny() 
else: 
    do_if_rainy() 

Alternatywnie, zawsze możesz użyć sys.exit.

if sunny: 
    print "It's sunny" 
    sys.exit(0) 

# Continue with non-sunny conditions 
+0

sys.exit() nie działa, ponieważ próbuję zaimportować je jako część większego programu. Wcięcie setek linii z powodu jednego warunku wydaje się złe. –

+0

Pomyślałem, że być może dlatego nie używasz 'sys.exit'. Poza przeniesieniem kodu do innego modułu (gdzie, aby być uczciwym, prawdopodobnie powinien być również wcięty w funkcję tam), myślę, że będziesz musiał go wciskać. To sposób w Pythonie! –

+0

Przypuszczam, że wcięcie jest sposobem w Pythonie. Kwestionowany kod jest w rzeczywistości garstką instrukcji importowania, więc tak naprawdę nie należy do funkcji ... –

0

ja poważnie iść z tego rozwiązania:

if sunny: 
    print "it's sunny" 
else: 
    exec ''' 
print "one" 
print "two" 
x = 3 
print x 
# ETC 
''' 
nie

poważnie. Ale to działa.

+1

Złe odpowiedzi są gorsze niż brak odpowiedzi. –

+0

Tak, prosiłeś o coś, co zdecydowanie było przeciwko zwyczajnej praktyce Pythona i dałem ci to, co uważałem za pasującą odpowiedź. W każdym razie jest to rozwiązanie. Naprawdę chciałbym zobaczyć, czy jest jakieś inne rozwiązanie, które spełni twoje wymagania. – bennedich

0

Można użyć funkcji to zrobić:

def foo(): 
    if True: 
     import re 
     import os 
    else: 
     import sys 
    return locals() 

locals().update(foo()) 

czyli

def foo(): 
    if not True: 
     import sys 
     return locals() 
    import re 
    import os 

    return locals() 

locals().update(foo()) 
1

Tylko w takiej samej sytuacji i nie chcę, aby wciąć całości zabili kod w moim modułu. Użyłem wyjątków, aby zatrzymać ładowanie modułu, przechwycić i zignorować niestandardowy wyjątek. To sprawia, że ​​mój moduł Pythona jest bardzo proceduralny (co, jak zakładam, nie jest idealny), ale zapisał kilka masowych zmian w kodzie.

miałem moduł common/wsparcie, które zdefiniowano następujące w:

import importlib 

def loadModule(module): 
    try: 
     importlib.import_module(module) 
    except AbortModuleLoadException: 
     pass; 

class AbortModuleLoadException(Exception): 
    pass; 

z tym, gdybym chciał „anuluj” lub „stop” ładowania modułu, chciałbym załadować moduł jako następująco:

loadModule('my_module'); 

I w moim modułu, mogę rzucić następujący wyjątek dla pewnego warunku:

if <condition>: 
    raise AbortModuleLoadException;