Domanda

Ho una funzione Python in cui sto eseguendo una sanificazione dei parametri di input:

def func(param1, param2, param3):
    param1 = param1 or ''
    param2 = param2 or ''
    param3 = param3 or ''

Questo si rivolge agli argomenti passati come Nessuno piuttosto che stringhe vuote. Esiste un modo più semplice / più conciso per eseguire il ciclo attorno ai parametri della funzione per applicare tale espressione a tutti loro. La mia funzione attuale ha nove parametri.

È stato utile?

Soluzione

Sembra un buon lavoro per un decoratore. Che ne dici di questo:

def sanitized(func):
    def sfunc(*args, **kwds):
        return func(*[arg or '' for arg in args],
                    **dict((k, v or '') for k,v in kwds.iteritems()))
    sfunc.func_name = func.func_name
    sfunc.func_doc = func.func_doc
    return sfunc

Lo useresti sulla tua funzione in questo modo:

@sanitized
def func(param1, param2, param3):
    print param1, param2, param3

Quindi i parametri saranno sostituiti dalla stringa vuota se sono falsi:

>>> func('foo', None, 'spam')
foo  spam

(Nota che ciò rovinerà comunque la firma della funzione come sottolinea Ned Batchelder nella sua risposta. Per risolvere il problema potresti usare Modulo decoratore di Michele Simionato - Penso che dovresti solo aggiungere un @decorator prima della definizione di sanitized )

Altri suggerimenti

Potresti fare un po 'di manipolazione dell'elenco:

def func(param1, param2, param3):
    param1, param2, param3 = map(lambda x: x or '', (param1, param2, param3))

ma non sono sicuro che sia meglio che scrivere solo le nove righe, dal momento che una volta arrivati ??a nove parametri, è una linea terribilmente lunga.

È possibile modificare la dichiarazione della funzione:

def func(*args):
    param1, param2, param3 = map(lambda x: x or '', args)

ma poi perdi la documentazione che deriva dall'avere nomi di parametri reali, così come la possibilità di modificare i valori predefiniti, ecc. E hai ancora una linea abbastanza fugace lì per decomprimerli.

Dico di scrivere le nove righe o cambiare la funzione per avere meno parametri: nove è comunque un po 'molto!

def func(x='', y='', z='hooray!'):
    print x, y, z

In [2]: f('test')
test  hooray!

In [3]: f('test', 'and')
test and hooray!

In [4]: f('test', 'and', 'done!')
test and done!
Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top