Python 为什么';t**在函数调用中解包Kwarg?

Python 为什么';t**在函数调用中解包Kwarg?,python,arguments,keyword-argument,Python,Arguments,Keyword Argument,这件事困扰了我一段时间: def test (*args, **kwargs): print target test(foo='bar', target='baz') 我假设底部aFunc调用中的target='test'将以kwargs结尾(确实如此),我还假设**将在函数调用中解包kwargs,因此target将作为关键字参数存在于aFunc中。没有。我知道它是以dict的形式出现的,但是我需要在参数列表中打开dict。这可能吗?简言之,有没有办法让*args和**kwargs消

这件事困扰了我一段时间:

def test (*args, **kwargs):
    print target

test(foo='bar', target='baz')

我假设底部aFunc调用中的
target='test'
将以kwargs结尾(确实如此),我还假设**将在函数调用中解包kwargs,因此target将作为关键字参数存在于aFunc中。没有。我知道它是以dict的形式出现的,但是我需要在参数列表中打开dict。这可能吗?简言之,有没有办法让*args和**kwargs消失,让实际的args和kwargs进入通话

编辑:我提出了一个案例,其中*args和**kwargs的解包可能会有所帮助:

假设我有一个打印列表的函数:

def printList (inputList=None):
    print inputList
我希望能够不通过列表,并提供默认列表:

def ensureList (listFunc):
    def wrapper (inputList=None):
        listFunc(inputList=inputList or ['a','default','list'])
    return wrapper

@ensureList
def printList (inputList=None):
    print inputList
现在我想让列表中继器变得更复杂一些:

@ensureList
def repeatList (inputList=None):
    print inputList*2
那很好。但现在我想重复:

@ensureList
def repeatList (times, inputList=None):
    print inputList*times
现在你可以说:

repeatList(5)
它将生成默认列表并重复5次

当然,这会失败,因为包装器无法处理times参数。我当然可以这样做:

@ensureList
def repeatList (inputList=None, times=1)
但我总是要这样做:

repeatList(times=5)
也许在某些情况下,我想强制提供一个值,所以非关键字arg是有意义的

当我去年第一次遇到这样的问题时,我认为一个简单的解决方案是删除包装器上的要求:

def ensureList (listFunc):
    "info here re: operating on/requiring an inputList keyword arg"
    def wrapper (*args, **kwargs):
        listFunc(inputList=inputList or ['a','default','list'])
    return wrapper
但这不管用。这就是为什么我想让args和kwargs实际扩展,或者我想有一种方法来进行扩展。然后,无论我提供了什么arg和kwarg,它们实际上都会填写参数,而不是列表和dict。包装器中的文档将解释需求。如果传入inputList,它实际上会进入,并且从包装器回调到repeatList中的inputList是有效的。如果您没有传入inputList,它将在回调到repeatList时使用默认列表创建它。如果您的函数不在乎,但使用了*kwargs,它只会优雅地接受它,而不会有任何问题


如果以上任何一项错误(超出一般概念),则表示歉意。我在这里打出来的,没有经过测试,而且已经很晚了。

对于这个特殊的案例,最明显的方法是

def test(foo=None, target=None):
    print target

test(foo='bar', target='baz')
如果要按名称访问函数中的参数,请在参数列表中显式命名。

对于“为什么不**在函数调用中解包kwargs?”的答案是:因为这不是一个好主意,开发函数的人不希望局部变量仅仅根据调用参数出现

所以,这不是它的工作方式,您肯定不希望python表现得像这样

要访问函数中的
目标
变量,您可以使用:

def test(target='<default-value>', *args, **kwargs):
    print target

“我需要在论点列表中打开口述。”——我无法想象你为什么需要这个。你能告诉我吗?如果你知道你将获得哪些选项,那么为什么要使用
**kwargs
?如何更好地做什么?你不知道我在做什么。我只是问我是否可以打开列表并在参数中记录。这不是抱怨。这只是陈述一个事实。这个网站有一个非常困难的人群。我会问一些直截了当的问题——有可能做到这一点吗?通过一个代码示例,我经常遇到人们问“你到底为什么要这么做?”也许我不想。我只是想知道我是否能做到。@GaryFixler:你在这个问题上试图达到的目的毫无意义,所以人们指出这一点是很自然的。@jamylak-你给人的印象是非常辱骂。我在Python中工作了3年。我整天都在用Python解决问题,但偶尔我会想不出一些事情,比如这件简单的事情——有人告诉我**dict将dict解压成key=value对,但它实际上似乎不是那样工作的,我也无法进一步了解它。我在这里问的是一些罕见的、奇怪的事情——我可能永远不会使用的事情——因为我可以自己或通过谷歌解决所有其他问题。我无意冒犯别人。我正在努力理解什么是可能的。这并不能回答问题。谢谢你回答这个问题。这似乎是不可能的。这是可能的,这只是一个坏主意,就像99%的时候有人认为他们想要动态创建变量名。回答得好,但你所说的“*参数无法自动解包,因为没有关联的变量名”是什么意思呢?谢谢你的更新,math。我绝对不想这样做:)那
target=kwargs.get('target','')
bit非常适合在瓶子/烧瓶类型的应用程序中使用,在这些应用程序中,您希望在url中有可选的关键字变量
def test(*args, **kwargs):
    target = kwargs.get('target', '<default-value>')
    print target
def test(*args, **kwargs):
    for i in kwargs:
        exec('%s = %s' % (i, repr(kwargs[i])))
    print target