質問

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

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

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

役に立ちましたか?

解決

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

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のデコレータモジュール- sanitized の定義の前に @decorator を追加するだけでよいと思います>

他のヒント

いくつかのリスト操作を行うことができます:

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行を書き出すか、関数のパラメーターを少なくするように変更します。とにかく、9は多くの種類です!

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!
ライセンス: CC-BY-SA帰属
所属していません StackOverflow
scroll top