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.

War es hilfreich?

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!
Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top