Getting the keyword arguments actually passed to a Python method

前端 未结 8 750
挽巷
挽巷 2020-12-24 03:45

I\'m dreaming of a Python method with explicit keyword args:

def func(a=None, b=None, c=None):
    for arg, val in magic_arg_dict.items():   # Where do I get         


        
8条回答
  •  余生分开走
    2020-12-24 04:06

    There's probably better ways to do this, but here's my take:

    def CompareArgs(argdict, **kwargs):
        if not set(argdict.keys()) <= set(kwargs.keys()):
            # not <= may seem weird, but comparing sets sometimes gives weird results.
            # set1 <= set2 means that all items in set 1 are present in set 2
            raise ValueError("invalid args")
    
    def foo(**kwargs):
        # we declare foo's "standard" args to be a, b, c
        CompareArgs(kwargs, a=None, b=None, c=None)
        print "Inside foo"
    
    
    if __name__ == "__main__":
        foo(a=1)
        foo(a=1, b=3)
        foo(a=1, b=3, c=5)
        foo(c=10)
        foo(bar=6)
    

    and its output:

    Inside foo
    Inside foo
    Inside foo
    Inside foo
    Traceback (most recent call last):
      File "a.py", line 18, in 
        foo(bar=6)
      File "a.py", line 9, in foo
        CompareArgs(kwargs, a=None, b=None, c=None)
      File "a.py", line 5, in CompareArgs
        raise ValueError("invalid args")
    ValueError: invalid args
    

    This could probably be converted to a decorator, but my decorators need work. Left as an exercise to the reader :P

提交回复
热议问题