以编程方式获取函数参数(不使用**kwargs)?

5

给定以下函数:

def test(* p1=None, p2=None):
  ...

以下是调用方式:

test(p2="hello")

我能否在运行时以编程方式获取参数列表/字典及其值?

1:不想使用**kwargs,因为我希望强制用户使用正确的参数名称(并计划进行类型注释)。

2:我已经查看了inspect模块以获取默认值,但似乎无法让我查看运行时的值。

希望创建类似于此代码的代码:

request = {k: v for k,v in __some_magic_location__ if v is not None}

1
* p1=None 是一个语法错误。你是不是想说 *, p1=None - Aran-Fey
你能修改 test 函数的定义吗? - Ma0
那么,在这种情况下,您想要输出{"p2": "hello"}还是{"p1": None, "p2": "hello"} - internet_user
很遗憾,它现在已经关闭了,但我也不想强制打开它。我只是想建议使用一个装饰器 def deco(f): def _f(**kwargs): print("PARAMS:", kwargs) return f(**kwargs) return _f 然后 @deco def test(...);这样,您可以使用 kwargs 打印参数,并同时防止用户传递无效的关键字参数或没有名称的参数。 - tobias_k
2个回答

5
使用 locals
>>> def test(*, p1=None, p2=None):
...     return locals()
...
>>> test(p2='hello')
{'p1': None, 'p2': 'hello'}

1
我认为可以安全地假设OP 不会更改“test”。 - Ma0
@Ev.Kounis,原帖中说他们“不想使用**kwargs”,所以我认为这正是他们想要的。 - Aran-Fey
@Rawing 你说得有道理。在这种情况下,这个问题似乎太琐碎了。 - Ma0
* 是用来做什么的? - mrCarnivore
是的,我可以更改测试。之前从未遇到过“locals”。“*”是Python3的语法,表示它后面的所有参数都需要按名称而不是位置传递。 - rgacote
另外,如果您在类方法中使用locals(),则需要过滤掉“self”条目。 - rgacote

1
您可以使用inspect.getcallargs:
import inspect
def test(*, p1=None, p2=None):
  pass

print(inspect.getcallargs(test, p2 = 'Hello'))

输出:

{'p2': 'Hello', 'p1': None}

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接