2

そのため、Python で提供される明示的な C# または Java スタイルの StringBuilder クラスはありません。私はPythonに少し慣れていないので、私のアイデアが良いものかどうかはわかりません.

イテラブルを結合するデコレータ (可能であれば) が必要だとします。この特定の例は別の方法で実装できますが、他の使用例も考えられます。そう ...

@string_builder
def build_insert_statement(table_name, col_names, values, where_clause):
    yield 'insert into '
    yield table_name
    yield ' ( '
    yield ', '.join(col_names)
    yield ' ) values ( '
    yield ', '.join(values)
    yield ' ) where '
    yield where_clause
    yield ';'

繰り返しますが、これを行う別の方法があることを知っています。しかし、これはできますか?デコレータは元の関数のシグネチャを常に尊重できますか? もしこれが可能なら、それは異端でしょうか?なんで?

4

1 に答える 1

2

の次の定義が機能するstring_builderはずです。

from functools import wraps

def string_builder(func):
    @wraps(func)
    def wrapped(*args, **kwargs):
        return ''.join(func(*args, **kwargs))
    return wrapped

質問で定義された関数をstring_builderデコレータとして使用する:

>>> build_insert_statement('foo', ['bar'], ['1'], 'baz')
'insert into foo ( bar ) values ( 1 ) where baz;'

functools.wraps[ ][1]を使用する必要はありませんが、使用しないとbuild_insert_statement.__name__装飾後の関数 ( ) の名前が「build_insert_statement」ではなく「ラップ」されるため、使用することをお勧めします。

それは可能です、それは良い考えですか?

あなたの例ではありませんが、他のユースケースがあると言いました。このようなデコレータは異端ではありませんが、実装がわかりにくくなる可能性があるため、デコレータを過度に使用しないでください。

行の長さが気になる場合は、次のいずれかの方法を検討してください。

  • ''.join()リストでの使用:

    def build_insert_statement(table_name, col_names, values, where_clause):
        return ''.join(['insert into ',
                        table_name,
                        ' ( ',
                        ', '.join(col_names),
                        ' ) values ( ',
                        ', '.join(values),
                        ' ) where ',
                        where_clause,
                        ';'])
    
  • 文字列を次のように組み合わせる+:

    def build_insert_statement(table_name, col_names, values, where_clause):
        return ('insert into ' +
                table_name +
                ' ( ' +
                ', '.join(col_names) +
                ' ) values ( ' +
                ', '.join(values) +
                ' ) where ' +
                where_clause +
                ';')
    
于 2012-10-26T23:50:12.980 に答える