Loop funksjonsparametre for helsesjekk

stemmer
3

Jeg har en Python funksjon der jeg gjør noen sanitisation av inngangsparametrene:

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

Dette borger for argumentene som sendes som ingen snarere enn tomme strenger. Er det en enklere / mer kortfattet måte å sløyfe rundt funksjonsparametre for å anvende et slikt uttrykk for alle av dem. Min faktiske funksjon har ni parametere.

Publisert på 03/01/2009 klokken 17:41
kilden bruker
På andre språk...                            


3 svar

stemmer
-2
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!
Svarte 03/01/2009 kl. 17:51
kilden bruker

stemmer
2

Du kan gjøre noen liste manipulasjon:

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

men jeg er ikke sikker på at er bedre enn bare å skrive ut de ni linjer, siden når du kommer til ni parametere, som er en heinously lang linje.

Du kan endre erklæringen av funksjon:

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

men da mister den dokumentasjonen som kommer fra å ha reelle parameternavn, samt muligheten for å endre standardinnstillingene, etc. Og du har fortsatt en ganske fugly linjen er det å pakke dem.

Jeg sier skrive ut de ni linjer, eller endre funksjonen til å ha færre parametre: ni er slags mye uansett!

Svarte 03/01/2009 kl. 18:19
kilden bruker

stemmer
7

Dette ser ut som en god jobb for en dekoratør. Hva med dette:

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

Du vil bruke dette på funksjonen slik:

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

Da parameterne vil bli erstattet av en tom streng hvis de er falske:

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

(Merk at dette vil fortsatt rotet opp funksjonen signaturen som Ned Batchelder påpeker i sitt svar å fikse som du kan bruke. Michele Simionato er dekoratør modul - Jeg tror du trenger bare å legge en @decoratorfør definisjonen av sanitized)

Svarte 03/01/2009 kl. 18:43
kilden bruker

Cookies help us deliver our services. By using our services, you agree to our use of cookies. Learn more