Verifica che una funzione sia eseguita solo da __main__ in Python

1

Spesso finisco con i file di codice che possono essere importati o eseguiti come __main__ . È facile gestirlo controllando se __name__ == '__main__' . Ma a volte, se la mia funzione principale diventa troppo grande, ne divido alcune parti in altre funzioni, aspettandomi che vengano chiamate solo quando __name__ == '__main__' . A volte applico questa condizione chiamando la seguente funzione assert_main :

def assert_main():
    "Use this in a module you only expect to get run as __main__, not imported"
    mod = sys._getframe(1).f_globals["__name__"]
    if "__main__" != mod:
        raise Exception("Module {} is not main".format(mod))

Altre opzioni includono la creazione di assert_main in un decoratore o la definizione delle funzioni in questione all'interno del blocco if __name__ == '__main__' . E potrebbero esserci altre opzioni a cui non ho pensato. Qual è la cosa da fare in modo idiomatico?

    
posta kuzzooroo 20.07.2014 - 01:15
fonte

1 risposta

1

What is the idiomatically correct thing to do?

Come ha fatto notare Martijn, non dovresti davvero preoccuparti di chi chiama il tuo codice.

Detto questo, il fatto che tu ti interessi è un odore che il tuo codice non è suddiviso in modo logico, ma piuttosto ovunque tu voglia dividere il codice.

Se il tuo metodo principale sta diventando troppo lungo, cerca i singoli metodi autonomi che possono essere estratti prima. Questi dovrebbero essere documentati abbastanza bene che il codice che importa quegli script può usare facilmente questi metodi.

Se ti ritrovi a scrivere molte interfacce della riga di comando ed è questo codice che non vuoi essere eseguito da un altro script, valuta se metterlo in un terzo file e importarlo e usarlo da lì. In questo modo chiunque ritenga che ci sia un valore in questi metodi può usarli con la stessa facilità con cui si desidera, e ti risparmia di riscrivere la stessa cosa. Potresti anche essere in grado di trovare una lib python appropriata per fare la stessa cosa per te.

    
risposta data 15.10.2014 - 17:51
fonte

Leggi altre domande sui tag