假设我有这样一个函数:
def destroy_all_the_users(a, b, c, d, e, f=2, *g, **h):
i = 2
似乎我可以计算它的最小值(我必须给它的最小参数),像这样:
import types
# This doesn't work on some C functions like, say, file.write
def get_minimum_arity(func_alike):
# This might not be a function but a method
if type(func_alike) is types.MethodType:
func_alike = func_alike.im_func
# This might not be a function but a __call__'able
if type(func_alike) is not types.FunctionType:
func_alike = func_alike.__call__
return func_alike.__code__.co_argcount - len(func_alike.__defaults__)
但是,我如何确定这5个参数的名称 ?对于destroy_all_the_users
,就是('a', 'b', 'c', 'd', 'e')
。看起来有希望的属性没有(例如,destroy_all_the_users.__code__.co_varnames
也包括g, h, i
),我不一定有函数的源代码。dis.dis(destroy_all_the_users)
的输出似乎同样没有帮助。
例如,我想检查任意类的file
性,该类甚至可能不是从file
派生的。您真正关心的是这个任意类有足够多的相同方法(比如write
),这意味着至少它们应该接受相同数量的参数(1,但更多可选参数不是问题)和相同的参数名称(…)坏例子:似乎file.write
是特殊的,不允许通过关键字传递它的强制参数))。
以下几行代码
>>> import inspect
>>> inspect.getfullargspec(destroy_all_the_users)
给出如下输出:
FullArgSpec(args=['a', 'b', 'c', 'd', 'e', 'f'],
varargs='g',
varkw='h',
defaults=(2,),
kwonlyargs=[],
kwonlydefaults=None,
annotations={})