3

入力パラメーターのサニタイズを行っている Python 関数があります。

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

これにより、引数が空の文字列ではなくNoneとして渡されます。関数パラメーターをループして、そのような式をすべてに適用する、より簡単で簡潔な方法はありますか。私の実際の関数には 9 つのパラメーターがあります。

4

3 に答える 3

7

これは、デコレーターにとって良い仕事のように見えます。これはどう:

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

これを関数で次のように使用します。

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

次に、パラメーターが false の場合、パラメーターは空の文字列に置き換えられます。

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

(Ned Batchelderが彼の回答で指摘しているように、これでも関数シグネチャが台無しになることに注意してください。修正するには、Michele Simionatoのdecoratorモジュール@decoratorを使用できます-の定義の前にa を追加するだけでよいと思いますsanitized

于 2009-01-03T18:43:01.063 に答える
2

リスト操作を行うことができます:

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

しかし、それが単に 9 行を書き出すよりも優れているかどうかはわかりません。パラメータが 9 つになると、非常に長い行になるからです。

関数の宣言を変更できます。

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

しかし、その後、実際のパラメーター名を持つことに由来するドキュメントや、デフォルトを変更する可能性などを失います。そして、それらを展開するためのかなり厄介な行がまだそこにあります。

私は 9 行を書き出すか、関数を変更してパラメーターを少なくすると言います。

于 2009-01-03T18:19:10.177 に答える
-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!
于 2009-01-03T17:51:38.547 に答える