使函数在 help() 函数中的参数有省略号

Make function have ellipsis for arguments in help() function

如果您键入 help(vars),将生成以下内容:

vars(...)
    vars([object]) -> dictionary

    Without arguments, equivalent to locals().
    With an argument, equivalent to object.__dict__.

当我执行以下操作时:

def func(x, y): pass

help(func)

它显示这个:

func(x, y)

如何更改它,使其像内置函数 vars() 一样在括号之间显示 ...? (即func(...)

编辑:有人建议使用文档字符串,但这不会满足我的要求。这是一个例子:

def func(x, y):
    """func(...) -> None"""

help(func)

结果:

func(x, y)
    func(...) -> None

你看,仍然显示 x, y 而不是 ...

你有(至少)两种选择来实现你想要的。

最好的替代方法是覆盖 inspect.Signature class 的 __str__ 方法。但是,由于它是用 C 编写的,所以它是只读的。

因此,您需要按如下方式扩展 class:

class MySignature(inspect.Signature):
  def __str__(self):
    return '(...)'

然后在定义函数后执行:

func_signature = inspect.signature(func)
func.__signature__ = MySignature(func_signature.parameters.values(), 
                                 return_annotation=func_signature.return_annotation)

然后 return help(func) 的以下内容:

Help on function func in module __main__:

func(...)
(END)

使用这种方法 inspect.signature 仍然有效:

In [1]: inspect.signature(func)
Out[1]: <MySignature (...)>

或者,如果您真的不关心能够正确地自省您的函数(可能还有其他一些用例),那么您可以将函数的 __signature__ 的值定义为一个对象,该对象不是一个 Signature 实例:

def func(x, y):
    pass

func.__signature__ = object()

help(func)

生成结果:

Help on function func in module __main__:

func(...)
(END)

但是现在 inspect.signature(func) 会加注 TypeError: unexpected object <object object at 0x10182e200> in __signature__ attribute.

注意:最后一个版本很老套,我不推荐它。

有关这两种技术以及签名如何工作的更多信息,请参阅 PEP 0362

更新: 对于 python 2.7,您可以执行以下操作(使用模拟框架可能更好):

In [1]: import inspect

In [2]: def myformatargspec(*args, **kwargs):
   ...:     return '(...)'
   ...:

In [3]: def func(x, y):
   ...:     pass
   ...: 

In [6]: inspect.formatargspec = myformatargspec

In [7]: help(func)

Help on function func in module __main__:

func(...)
(END)