Paramètres de fonction de boucle pour le contrôle de cohérence
-
03-07-2019 - |
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.
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!