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))

现在,如果未设置 tag 参数,消息会告诉您。如果没有此代码,您获得的唯一信息是带有缺失键名称的 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 回答