Python 内省函数,用于确定使用了哪个参数解包(位置或关键字)

Python 内省函数,用于确定使用了哪个参数解包(位置或关键字),python,python-3.x,introspection,argument-passing,keyword-argument,Python,Python 3.x,Introspection,Argument Passing,Keyword Argument,我正在寻找一种方法来确定是否有一些参数用于解包,我发现: >>def func有位置参数(func): std_args=func.func_code.co_argcount 通配符参数=len(func.func\u code.co\u varnames)-std\u参数 如果通配符_args==2: return True#yes,同时包含位置参数和关键字参数 elif通配符参数==0: return False#既没有位置参数,也没有关键字参数 其他: raise NOTEImplemen

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

>>def func有位置参数(func):
std_args=func.func_code.co_argcount
通配符参数=len(func.func\u code.co\u varnames)-std\u参数
如果通配符_args==2:
return True#yes,同时包含位置参数和关键字参数
elif通配符参数==0:
return False#既没有位置参数,也没有关键字参数
其他:
raise NOTEImplementedError('无法判断')
>>>func\u有关键字参数=func\u有位置参数
>>>def测试1(a、b、*args、**kwargs):通过
>>>func_有位置参数(test1),func_有关键字参数(test1)
(对,对)
>>>def测试2(a,b):通过
>>>func_有位置参数(test2),func_有关键字参数(test2)
(假,假)
>>>def测试3(a、b、*参数):通过
>>>func有位置参数(test3)
回溯(最近一次呼叫最后一次):
文件“”,第1行,在
func有位置参数(test3)
函数中第9行的文件“”具有位置参数
raise NOTEImplementedError('无法判断')
NotImplementedError:无法判断
所以我可以告诉你,如果没有位置参数,也没有关键字参数。我还可以判断两者是否都有,但如果只有一个“通配符”,我无法区分实现了哪个“通配符”类型的参数

你能帮我达到以下效果吗

#已对上述代码感到满意:
assert func有位置参数(test1)==True
assert func_有_关键字_参数(test1)=True
assert func有位置参数(test2)==False
assert func_有_关键字_参数(test2)==False
#缺少功能(测试失败):
assert func_具有位置参数(test3)=True
assert func_有_关键字_参数(test3)=False

另外,Python3是否改变了此功能或其行为?

正如mgilson所评论的,使用
inspect.getargspec
(最好是在Python3.x中)

例如:

>>> 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

... 我不确定我是否真的密切关注这一点,但您不是在寻找
inspect.getargspec
?你现在做的有什么不同吗?@mgilson:是的,bullseye;)似乎我太专注于查找函数属性,而不是查看
inspect
模块。。。您愿意将其作为答案发布吗?谢谢,所以编写Python2.x+3.x兼容代码的首选方法是在导入
inspect
期间实际执行该操作,对吗?我没有找到此函数的
six
模块支持。@t如果您想要在Python 2、3中同时运行的代码,请选择Tadeck。使用
inspect.getargspec
。(将
varkw
替换为
keywords
)。@Tadeck,
inspect.getargspec
根据文档不推荐使用。但是
getargspec
即使在中也仍然存在。
>>> 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