将在 wrapper-function 定义中收到的 **kwargs 传递给封闭(即包装)函数调用的参数
Passing **kwargs received in a wrapper-function definition, to arguments of an enclosed (i.e. wrapped) function call
哦,天哪,我希望我的标题是对的。 :)
如何将提供给 wrapper-function definition 的 **kwargs 传递给另一个(封闭的)函数 调用它包装的。例如:
def wrapped_func(**kwargs):
# Do some preparation stuff here.
func('/path/to/file.csv', comma_separated_key=value_injected_here)
# Do some other stuff.
例如,这个调用:
wrapped_func(error_bad_lines=True, sep=':', skip_footer=0, ...)
结果应该是:
func('/path/to/file.csv', error_bad_lines=True, sep=':', skip_footer=0, ...)
在过去的几个小时里,我尝试了多种方法,但每种方法都暴露了 type-preservation 漏洞(针对值)。我以前没有使用过这种特殊的包装器模式,想知道社区是否可以提供一些帮助。提前谢谢你。
定义非常自定义的包装器的一种简单方法是定义您自己的包装器 class:
class AdditionWrapper:
def __init__(self, func):
self.func = func
def __call__(self, **kwargs):
return self.func('/path/to/file.csv', **kwargs)
您还可以自定义路径:
class AdditionWrapper:
_path = '/path/to/file.csv'
def __init__(self, func):
self.func = func
def __call__(self, **kwargs):
return self.func(self._path, **kwargs)
def set_path(self, path):
self._path = path
使用:
@AdditionWrapper
def myfunc(...):
...
myfunc.set_path(mypath)
**kwargs
是一个字典,这意味着您可以使用双拼音 (**
) 到 unpack it as a list of keyword arguments。所以你的包装函数可能是这样的:
def wrapped_func(**kwargs):
# Do some preparation stuff here.
func('/path/to/file.csv', **kwargs)
# Do some other stuff.
调用函数时使用相同的语法将 kwargs 字典扩展为关键字参数:
func('/path/to/file.csv', **kwargs)
你也可以用同样的方式传入位置参数
func('/path/to/file.csv', *args, **kwargs)
这是关于该主题的 Python 文档的 link:https://docs.python.org/2/tutorial/controlflow.html#unpacking-argument-lists
为什么不简单地合并 kwargs:
def func(*args, **kwargs):
print args
print kwargs
def wrapped_func(**kwargs):
# Do some preparation stuff here.
func('/path/to/file.csv', **dict(comma_separated_key='value_injected_here', **kwargs))
# Do some other stuff.
wrapped_func(error_bad_lines=True, sep=':', skip_footer=0)
# Outputs:
('/path/to/file.csv',)
{'skip_footer': 0, 'error_bad_lines': True, 'comma_separated_key': 'value_injected_here', 'sep': ':'}
哦,天哪,我希望我的标题是对的。 :)
如何将提供给 wrapper-function definition 的 **kwargs 传递给另一个(封闭的)函数 调用它包装的。例如:
def wrapped_func(**kwargs):
# Do some preparation stuff here.
func('/path/to/file.csv', comma_separated_key=value_injected_here)
# Do some other stuff.
例如,这个调用:
wrapped_func(error_bad_lines=True, sep=':', skip_footer=0, ...)
结果应该是:
func('/path/to/file.csv', error_bad_lines=True, sep=':', skip_footer=0, ...)
在过去的几个小时里,我尝试了多种方法,但每种方法都暴露了 type-preservation 漏洞(针对值)。我以前没有使用过这种特殊的包装器模式,想知道社区是否可以提供一些帮助。提前谢谢你。
定义非常自定义的包装器的一种简单方法是定义您自己的包装器 class:
class AdditionWrapper:
def __init__(self, func):
self.func = func
def __call__(self, **kwargs):
return self.func('/path/to/file.csv', **kwargs)
您还可以自定义路径:
class AdditionWrapper:
_path = '/path/to/file.csv'
def __init__(self, func):
self.func = func
def __call__(self, **kwargs):
return self.func(self._path, **kwargs)
def set_path(self, path):
self._path = path
使用:
@AdditionWrapper
def myfunc(...):
...
myfunc.set_path(mypath)
**kwargs
是一个字典,这意味着您可以使用双拼音 (**
) 到 unpack it as a list of keyword arguments。所以你的包装函数可能是这样的:
def wrapped_func(**kwargs):
# Do some preparation stuff here.
func('/path/to/file.csv', **kwargs)
# Do some other stuff.
调用函数时使用相同的语法将 kwargs 字典扩展为关键字参数:
func('/path/to/file.csv', **kwargs)
你也可以用同样的方式传入位置参数
func('/path/to/file.csv', *args, **kwargs)
这是关于该主题的 Python 文档的 link:https://docs.python.org/2/tutorial/controlflow.html#unpacking-argument-lists
为什么不简单地合并 kwargs:
def func(*args, **kwargs):
print args
print kwargs
def wrapped_func(**kwargs):
# Do some preparation stuff here.
func('/path/to/file.csv', **dict(comma_separated_key='value_injected_here', **kwargs))
# Do some other stuff.
wrapped_func(error_bad_lines=True, sep=':', skip_footer=0)
# Outputs:
('/path/to/file.csv',)
{'skip_footer': 0, 'error_bad_lines': True, 'comma_separated_key': 'value_injected_here', 'sep': ':'}