gpt4 book ai didi

python - 用于确定使用了哪个参数解包(位置或关键字)的内省(introspection)函数

转载 作者:太空宇宙 更新时间:2023-11-03 15:15:54 25 4
gpt4 key购买 nike

我正在寻找一种方法来确定是否使用了一些参数来解包,我发现了这个:

>>> def func_has_positional_args(func):
std_args = func.func_code.co_argcount
wildcard_args = len(func.func_code.co_varnames) - std_args
if wildcard_args == 2:
return True # yes, has both positional and keyword args
elif wildcard_args == 0:
return False # has neither positional, nor keyword args
else:
raise NotImplementedError('Unable to tell')


>>> func_has_keyword_args = func_has_positional_args
>>> def test1(a, b, *args, **kwargs): pass

>>> func_has_positional_args(test1), func_has_keyword_args(test1)
(True, True)
>>> def test2(a, b): pass

>>> func_has_positional_args(test2), func_has_keyword_args(test2)
(False, False)
>>> def test3(a, b, *args): pass

>>> func_has_positional_args(test3)

Traceback (most recent call last):
File "<pyshell#52>", line 1, in <module>
func_has_positional_args(test3)
File "<pyshell#41>", line 9, in func_has_positional_args
raise NotImplementedError('Unable to tell')
NotImplementedError: Unable to tell

所以我可以判断,如果没有位置参数,也没有关键字参数解包。我也能判断是否两者都有,但如果只有一个“通配符”,我无法区分实现了哪个“通配符”类型参数。

你能帮我实现以下结果吗?

# Already satisfied with above code:
assert func_has_positional_args(test1) == True
assert func_has_keyword_args(test1) == True
assert func_has_positional_args(test2) == False
assert func_has_keyword_args(test2) == False

# Missing functionality (tests are failing):
assert func_has_positional_args(test3) == True
assert func_has_keyword_args(test3) == False

此外,Python 3 是否改变了有关此功能或其行为的任何内容?

最佳答案

正如 mgilson 评论的那样,使用 inspect.getargspec(在 Python 3.x 中更优选 inspect.getfullargspec)。

import inspect

def func_has_positional_args(func):
spec = inspect.getfullargspec(func)
return bool(spec.varargs) # varargs: name of the * argument or None
def func_has_keyword_args(func):
spec = inspect.getfullargspec(func)
return bool(spec.varkw) # varkw: name of the ** argument or None

例子:

>>> def test1(a, b, *args, **kwargs): pass
...
>>> def test2(a, b): pass
...
>>> def test3(a, b, *args): pass
...
>>> func_has_positional_args(test1)
True
>>> func_has_keyword_args(test1)
True
>>> func_has_positional_args(test2)
False
>>> func_has_keyword_args(test2)
False
>>> func_has_positional_args(test3)
True
>>> func_has_keyword_args(test3)
False

关于python - 用于确定使用了哪个参数解包(位置或关键字)的内省(introspection)函数,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/21037549/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com