2

Python で関数をオーバーロードできないため、未定義の量の引数と変数定義を調べて、呼び出された関数に渡す必要がありました*args**kwargs私はその概念を、区切り記号を使用して画面に引数を出力する単純な関数に適用しようとしました (その間にすべての周りに厄介な "" はありません)。その投稿の最後にコード スニペットがあります。

私の問題は、kwargs の値をそれぞれのパラメーター OUTSIDE CLASSES に実際に割り当てる正しい方法がわからないことです。setattr3 つの引数 ( ) を取るuse が必要な場合setatt(self, key, value)、もちろん、キーと値のみを渡そうとすると、常にエラーが発生します。クラス外のグローバル関数のパラメータに値を割り当てる適切な方法はありますか?

あなたが私のために空をきれいにしてくれることを願っています。

ここでは、代わりの方法を見つけて作業を開始したい、動作しないコード例を示しますsetattr(self, key, value)

import sys

def printAll(*args, **kwargs):
    sep = ""
    for key, value in kwargs.items():
        setattr(key, value)
    for arg in args:
        sys.stdout.write(str(arg))
        sys.stdout.write(sep)

nr = 9876543210
printAll("How many", "arguments", " I want", nr, sep='-')

編集: わかりました、@Martijn Pieters と @Fabian の回答を読んだ後、更新された実際の関数の例を次に示します。

def printAll(*args, **kwargs):
    # use sep = 'value' to define a seperator or use the default one
    sep = kwargs.get('sep')
    if sep is None:
        sep = ""
    for arg in args:
        sys.stdout.write(str(arg))
        sys.stdout.write(sep)
4

2 に答える 2

2

Python 2:

def foo(*args, **kwargs):
    for key, value in kwargs.iteritems():
        locals()[key] = value
    return foobar
    exec ''

print foo(foobar=12)

ただし、これは良い考えではありません。kwargsMartijnが言ったように、具体的にアクセスする必要があります。通常、関数にステートメントlocals()を入れない限り、関数を変更することはできません。名前空間が変更された可能性があるため(この場合は変更された)exec、インタプリタは再度アクセスする必要があります。ステートメントを直後locals()に置くだけで十分なので、そこにある限り、ステートメントは実行されません。execreturn

これをしないでください。

于 2013-03-18T10:33:11.470 に答える
1

通常、値をローカル変数として設定することはありません。kwargsこれは辞書です。含まれている値を参照してください。

sys.stdout.write(kwargs.get('sep', ''))
于 2013-03-18T10:25:13.953 に答える