Loop-Funktion Parameter für die Plausibilitätsprüfung
-
03-07-2019 - |
Frage
Ich habe eine Python-Funktion, in der ich einige Hygienisierung des Eingangsparameters tue:
def func(param1, param2, param3):
param1 = param1 or ''
param2 = param2 or ''
param3 = param3 or ''
Dies sorgt für die Argumente als Keine , anstatt leere Strings übergeben werden. Gibt es eine einfachere / prägnanter Weise in einer Schleife um die Funktionsparameter einen solchen Ausdruck zu allen von ihnen zu übernehmen. Meine eigentliche Funktion hat neun Parameter.
Lösung
Das sieht aus wie eine gute Arbeit für einen Dekorateur. Wie wäre es damit:
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
Sie würden dies wie so auf Ihre Funktion:
@sanitized
def func(param1, param2, param3):
print param1, param2, param3
Dann werden die Parameter durch die leere Zeichenkette ersetzt werden, wenn sie falsch sind:
>>> func('foo', None, 'spam')
foo spam
(Beachten Sie, dass dies immer noch Chaos der Funktion Signatur als Ned Batchelder nach oben weist in seiner Antwort aus. Um dies zu beheben, dass Sie Michele Simionato Dekoratorklasse Modul - ich glaube, Sie müssen nur eine @decorator
vor der Definition von sanitized
hinzufügen)
Andere Tipps
Sie könnte eine Liste Manipulation tun:
def func(param1, param2, param3):
param1, param2, param3 = map(lambda x: x or '', (param1, param2, param3))
, aber ich bin nicht sicher, das ist besser, als nur die neun Linien auszuschreiben, da, sobald Sie zu neun Parameter bekommen, das ist eine heinously lange Linie.
Sie können die Deklaration der Funktion ändern:
def func(*args):
param1, param2, param3 = map(lambda x: x or '', args)
aber dann verlieren Sie die Dokumentation, die aus mit realen Parameternamen kommt, sowie die Möglichkeit, die Standardeinstellungen zu ändern, etc. Und Sie immer noch eine ziemlich fugly Linie dort müssen sie auspacken.
Ich sage schreiben die neun Linien oder die Funktion ändern weniger Parameter haben: neun Art viel ist sowieso
!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!