是否可以在不调用Python函数的情况下确定最小arity和相关参数名称?

时间:2014-07-13 09:09:55

标签: python-3.x reflection

说我有这个功能:

def destroy_all_the_users(a, b, c, d, e, f=2, *g, **h):
  i = 2

似乎我可以计算它的最小arity(我必须提供的最小参数量),如下所示:

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是特殊的,并且不允许通过关键字传递其强制参数))。 /子>

1 个答案:

答案 0 :(得分:2)

这些代码行

>>> 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={})