0

これを自動化/単純化したい:

def test(stream, tag):
    subprocess.call('git submodule checkout {stream}-{tag}'.format(stream=stream, tag=tag))

つまり、stream=stream と tag=tag を取り除き、何とか **kwargs のようなものを利用したいと考えています。これは可能ですか?

4

3 に答える 3

4

私の 2 セント: 乱用しないでください。パラメーターの数が事前に**kwargsわかっていない場合にのみ使用してください。

関与しないいくつかのアプローチを次に示します**kwargs

簡単

行の長さに関心がある場合は、暗黙的な順序を使用してスペースを節約できます。

def test(stream, tag):
    subprocess.call('git submodule checkout {}-{}'.format(stream, tag))

これはフォーマット文字列の読みやすさを犠牲にしていますが、ワンライナーの場合はそれで十分かもしれません。

オブジェクト スタイル

Checkoutパラメータをオブジェクトにラップします。

class Checkout:
    def __init__(self, stream, tag):
        self.stream = stream
        self.tag = tag

#...

def test(checkout):
    subprocess.call('git submodule checkout {0.stream}-{0.tag}'.format(checkout))

あるいは:

class Checkout:
    def __init__(self, stream, tag):
        self.stream = stream
        self.tag = tag

    def test(self):
        subprocess.call('git submodule checkout {0.stream}-{0.tag}'.format(self))

これは冗長ですが、Checkoutオブジェクトは単純なラッパー以上のものであり、別の場所で再利用されるかシリアライズされる可能性があります。

于 2013-05-14T23:23:45.630 に答える
2

これはうまくいくはずです:

def test(**kwargs):
    subprocess.call("git submodule checkout {stream}-{tag}".format(**kwargs))

ここで、いくつかのデフォルト値を追加するか、より明確なエラー メッセージを表示することができます。

def test(**kwargs):
    #set a default value for "stream"
    if "stream" not in kwargs:
        kwargs["stream"] = "mystream"
    if "tag" not in kwargs:
        raise ValueError("Please add some tags")
    subprocess.call("git submodule checkout {stream}-{tag}".format(**kwargs))

これで、タグ引数が設定されていない場合、メッセージでその旨が通知されます。このコードがなければ、得られる唯一の情報は、不足しているキーの名前を持つ KeyError です。

于 2013-05-14T23:15:38.177 に答える
0

locals()ローカル変数の辞書を渡すために使用できます。

def test(stream, tag):
    subprocess.call('git submodule checkout {stream}-{tag}'.format(**locals()))
于 2013-05-14T23:15:17.580 に答える