Strumento CLI con struttura sovraccaricata

1

Ho uno strumento CLI Python che il mio dipartimento usa per elaborare un file excel aiutato da un yaml. Ho provato a disegnare qui un flusso di lavoro di base:

Passaggio1:l'utentescaricaunxlsx,loinserisceinunfile,eseguetool--preprocesscheaccettaalcuniinputA,B,Ceilnomedelfile.Questopassaggiononfanulla,vedilamiadomandaquisotto.

Passaggio2:l'utenteeseguetool--startdovedannoglistessiinput.Tuttaviaquestavoltausaisuoiinputeilxlsxpergenerareunyaml.

Passaggio3:l'utenteterminal'aggiornamentodiyamledeseguetool--buildcherichiedesolounyamleunxlsxeloconverteinunpdfgigante.

Unacosachehonotatoèchealcunideimieiutentistannofacendodituttoperapportarealcunemodificheaifileperchésonouncasolimite.Adesempio:potrebberocrearealcunifoglidilavoroprimadiutilizzaretool--start.

Eccolamiadomanda:comepossoconsentireagliutentidi"agganciarsi" a ogni passaggio, cioè, consentire loro di scrivere un file / funzione python personalizzato che viene salvato in un file diverso (non voglio avere un utente personalizzato rendere tutte le funzionalità):

Quindi anziché:

def preprocess():
    # do stuff
    if input == "A":
        # user 1 code
    if input == "B":
        # user 2 code
    # convert to expected form

Forse potrebbero spingere verso l'alto un file come "A.py" che ha def overload_preprocess() e quindi lo strumento dovrebbe importare il file ed eseguire la loro funzione a seconda dei loro input?

    
posta Tony 11.12.2018 - 13:29
fonte

2 risposte

2

È possibile importare dinamicamente i file creati dagli utenti ed eseguire le funzioni appropriate; forse hanno una funzione run() in ciascuna.
Questi file sono forniti come argomenti di input quando eseguono il tuo tool .

tool --userFiles A,B

Ecco un esempio di tale file utente:
A.py

def run():
    # Do something
    return

Il tuo tool analizzerà quindi i suoi argomenti e chiamerà, diciamo, preprocess con l'elenco dei nomi di file utente.

userFiles = ['A', 'B'] # determined by your arg parser
preprocess(userFiles)

E la tua funzione importerà quei file utente ed eseguirli.

def preprocess(*args):
    for a in args:
        userFile = __import__(a)
        userFile.run()
    
risposta data 19.12.2018 - 00:05
fonte
1

Se un utente dà un nome file, puoi fare qualcosa di simile per eseguire codice arbitrario:

exec(open(filename).read())
def preprocess(fileName=None):
    # do stuff
    if fileName != None:
       exec(open(fileName).read())
    
risposta data 18.01.2019 - 06:01
fonte

Leggi altre domande sui tag