让kwargs直接访问

dan*_*ast 4 python arguments kwargs

我正在重构一段代码,我遇到了以下问题.我有一个巨大的参数列表,现在我想传递给它kwargs.代码是这样的:

def f(a, b, c, ...):
  print a
  ...

f(a, b, c, ...)
Run Code Online (Sandbox Code Playgroud)

我正在重构它:

data = dict(a='aaa', b='bbb', c='ccc', ...)
f(**data)
Run Code Online (Sandbox Code Playgroud)

这意味着我必须这样做:

def f(**kwargs):
  print kwargs['a']
  ...
Run Code Online (Sandbox Code Playgroud)

但这是一个皮塔饼.我想保留:

def f(**kwargs):
  # Do some magic here to make the kwargs directly accessible
  print a
  ...
Run Code Online (Sandbox Code Playgroud)

是否有任何直接的方法kwargs dict可以直接访问参数,也许通过使用一些帮助类/库?

Inb*_*ose 7

有一些方法 - 但你也可以像这样包装你的函数:

def f(**kwargs):
    arg_order = ['a', 'b', 'c', ...]
    args = [kwargs.get(arg, None) for arg in arg_order]

    def _f(a, b, c, ...):
        # The main code of your function

    return _f(*args)
Run Code Online (Sandbox Code Playgroud)

样品:

def f(**kwargs):
    arg_order = ['a', 'b', 'c']
    args = [kwargs.get(arg, None) for arg in arg_order]

    def _f(a, b, c):
        print a, b, c

    return _f(*args)

data = dict(a='aaa', b='bbb', c='ccc')
f(**data)
Run Code Online (Sandbox Code Playgroud)

输出:

>>> 
aaa bbb ccc
Run Code Online (Sandbox Code Playgroud)


vah*_*bdi 1

函数内部:

for k, v in kwargs.iteritems():
    locals()[k] = v
Run Code Online (Sandbox Code Playgroud)

  • 请参阅http://stackoverflow.com/questions/8028708/dynamically-set-local-variable-in-python 了解为什么这不会(总是)起作用。 (3认同)