Passing more kwargs into a function than initially set

血红的双手。 提交于 2019-11-30 08:30:14

问题


Is there a way to send more kwargs into a function than is called for in the function call?

Example:

def mydef(a, b):
    print a
    print b

mydict = {'a' : 'foo', 'b' : 'bar'}
mydef(**mydict)    # This works and prints 'foo' and 'bar'

mybigdict = {'a' : 'foo', 'b' : 'bar', 'c' : 'nooooo!'}
mydef(**mybigdict)   # This blows up with a unexpected argument error

Is there any way to pass in mybigdict without the error? 'c' would never be used in mydef in my ideal world and would just be ignored.

Thanks, my digging has not come up with what I am looking for.

Edit: Fixed the code a bit. The mydef(a, b, **kwargs) was the form that I was looking for, but the inspect function args was a new thing to me and definitely something for my toolbox. Thanks everyone!


回答1:


To clarify Martijn Pieters's answer (for sake of clarity). It's possible if you change the function signature to:

def mydef(a, b, **kwargs):

This means it's not possible without changing the signature. But if that's not a problem it'll work.




回答2:


No, unless the function definition allows for more parameters (using the **kwargs catch-all syntax), you cannot call a method with more arguments than it has defined.

You can introspect the function and remove any arguments it won't accept however:

import inspect

mybigdict = {'a2' : 'foo', 'b2' : 'bar', 'c2' : 'nooooo!'}
argspec = inspect.getargspec(mydef)
if not argspec.keywords:
    for key in mybigdict.keys():
        if key not in argspec.args:
            del mybigdict[key]
mydef(**mybigdict)

I'm using the inspect.getargspec() function to check if the callable supports a **kwarg catch-all via .keywords, and if it doesn't, I use the .args information to remove anything the method won't support.



来源:https://stackoverflow.com/questions/12093726/passing-more-kwargs-into-a-function-than-initially-set

标签
易学教程内所有资源均来自网络或用户发布的内容,如有违反法律规定的内容欢迎反馈
该文章没有解决你所遇到的问题?点击提问,说说你的问题,让更多的人一起探讨吧!