如何在Python中获取内置函数的args数量?

时间:2010-07-18 18:08:22

标签: python

我需要以编程方式获取函数所需的参数数量。使用模块中声明的函数,这很简单:

myfunc.func_code.co_argcount

但内置函数没有func_code属性。还有另一种方法吗?否则我不能使用内置函数,必须在我的代码中重写它们。

[补充]感谢您的回复,希望它们有用。我改用了Pypy。

5 个答案:

答案 0 :(得分:2)

查看从here复制的以下功能。这可能是你能做的最好的事情。请注意有关inspect.getargspec的评论。

def describe_builtin(obj):
   """ Describe a builtin function """

   wi('+Built-in Function: %s' % obj.__name__)
   # Built-in functions cannot be inspected by
   # inspect.getargspec. We have to try and parse
   # the __doc__ attribute of the function.
   docstr = obj.__doc__
   args = ''

   if docstr:
      items = docstr.split('\n')
      if items:
         func_descr = items[0]
         s = func_descr.replace(obj.__name__,'')
         idx1 = s.find('(')
         idx2 = s.find(')',idx1)
         if idx1 != -1 and idx2 != -1 and (idx2>idx1+1):
            args = s[idx1+1:idx2]
            wi('\t-Method Arguments:', args)

   if args=='':
      wi('\t-Method Arguments: None')

   print

答案 1 :(得分:1)

我不相信内置函数或任何C扩展函数都可以进行这种内省。

此处已经询问similar question,Alex的回答建议解析函数的docstring以确定args的数量。

答案 2 :(得分:1)

也许是Alex给出的解析函数的更强大的替代方法,但是仍然无法给出适当的arg规范,因为并非所有文档字符串都完全代表其函数的签名。

一个很好的例子是dict.get,其中args规范应该是(k, d=None),但我定义的函数将返回(k, d),因为{{1}没有给出默认值以d的形式。在文档字符串d=None中,args "f(a[, b, c])"b是默认值,但是没有真正的方法来解析它们,因为没有直接指定值,并且在{c的情况下1}},行为将在后面描述,而不是在签名表示中。

但从好的方面来说,这可以捕捉所有的论点,只是默认值不可靠。

dict.get

答案 3 :(得分:0)

这是不可能的。 C函数不会以编程方式公开其参数签名。

答案 4 :(得分:0)

有趣的解决方案,ars。希望它也能帮助别人。

我采取了另一种方式:我听说过Pypy本身就是python实现的。所以我尝试了PyPy(JIT版本)并且它有效。我还没有找到“硬编码”功能。无法找到如何在/ usr中安装它,但它可以从解压缩的文件夹中运行。