Question

J'ai une fonction Python dans laquelle je désinfecte les paramètres d'entrée:

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

Ceci concerne les arguments passés en tant que Aucun plutôt que des chaînes vides. Existe-t-il un moyen plus simple / plus concis d’enrouler les paramètres de la fonction pour appliquer une telle expression à chacun d’eux? Ma fonction actuelle a neuf paramètres.

Était-ce utile?

La solution

Cela semble être un bon travail pour un décorateur. Que diriez-vous de ceci:

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

Vous utiliseriez ceci pour votre fonction comme ceci:

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

Ensuite, les paramètres seront remplacés par la chaîne vide s'ils sont faux:

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

(Notez que cela va toujours gâcher la signature de la fonction, comme le souligne Ned Batchelder dans sa réponse. Pour résoudre ce problème, vous pouvez utiliser Module de décorateur de Michele Simionato - Je pense qu'il vous suffirait d'ajouter un @decorator avant la définition de sanitisé .

Autres conseils

Vous pouvez manipuler des listes:

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

mais je ne suis pas sûr que ce soit mieux que de simplement écrire les neuf lignes, car une fois que vous arrivez à neuf paramètres, c'est une ligne extrêmement longue.

Vous pouvez modifier la déclaration de la fonction:

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

mais vous perdez alors la documentation générée par les noms de paramètres réels, ainsi que par la possibilité de modifier les valeurs par défaut, etc.

Je dis d’écrire les neuf lignes ou de changer la fonction pour avoir moins de paramètres: neuf c’est quand même un peu beaucoup!

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!
Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top