use*_*023 7 python function parameter-passing
我正在尝试生成一个包含非None参数当前调用的名称和值的字典。这非常感觉应该是内置的,但在 Python 文档中找不到任何能完全做到这一点的东西。
例如,当
\ndef foo(limit=None, offset=None, lower_bound=None, upper_bound=None):\n\n # code to generate dict of non-`None` named arguments (see below)\n\n ... # other things happen later\nRun Code Online (Sandbox Code Playgroud)\n使用参数调用foo(limit=5, lower_bound=100),我需要以下字典:{limit=5, lower_bound=100}。
有什么东西可以方便地为我做到这一点吗?
\n到目前为止,我已经研究了以下内容,所有这些似乎都有缺陷:
\ndef foo(limit=None, offset=None, lower_bound=None, upper_bound=None):\n keys = (\'limit\', \'offset\', \'lower_bound\', \'upper_bound\')\n values = (limit, offset, lower_bound, upper_bound)\n magic_dict = {k: v for k, v in zip(keys, values) if v is not None}\nRun Code Online (Sandbox Code Playgroud)\nlocals()\xe2\x80\x94链接\xe2\x80\x94 需要删除所有不应该进入字典的内容(即值为 的键None)。如果变量定义添加到魔法字典代码之上,这似乎也容易出错,这也需要删除。def foo(limit=None, offset=None, lower_bound=None, upper_bound=None):\n magic_dict = {k: v for k, v in locals().items() if v is not None}\nRun Code Online (Sandbox Code Playgroud)\ninspect\'s \xe2\x80\x94链接\xe2\x80\x94signature和bind,仍然需要参数列表def foo(limit=None, offset=None, lower_bound=None, upper_bound=None):\n sig = signature(foo)\n sig_args = sig.bind(limit, offset, lower_bound, upper_bound).arguments\n magic_dict = {k: v for k, v in sig_args.items() if v is not None}\n\nRun Code Online (Sandbox Code Playgroud)\n其他想法包括开设一个课程以getattr提供
感觉就像我错过了一些明显的 \xe2\x80\x94\xc2\xa0feedback 将不胜感激!
\n有人建议\n从参数中选择所有非 None 元素并将它们放入 python 字典中的优雅方法是什么?,其回答主要是“移至**kwargs”。我最初的反应是我更愿意保留一个特定的参数列表 \xe2\x80\x94 这是我的逻辑不好吗?Python 的典型最佳实践是什么?
您可以尝试使用装饰器:
def capture(func):
capture.kwds = None
def wrap(*args, **kwargs):
capture.kwds = kwargs
return func(*args, **kwargs)
return wrap
@capture
def foo(limit=None, offset=None, lower_bound=None, upper_bound=None):
return None
Run Code Online (Sandbox Code Playgroud)
现在您可以致电:
>>> foo(limit=1, offset=2, lower_bound=3, upper_bound=4)
None
>>> capture.kwds
{'limit': 1, 'offset': 2, 'lower_bound': 3, 'upper_bound': 4}
Run Code Online (Sandbox Code Playgroud)