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

时间:2016-02-27 02:53:32

标签: python docstring

如果您输入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(...)

编辑:建议使用docstring,但这不符合我的要求。这是一个例子:

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

help(func)

结果:

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

您看,x, y仍在显示,而不是...

1 个答案:

答案 0 :(得分:8)

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

最好的替代方法是覆盖__str__类的inspect.Signature方法。但是,由于它是用C语言编写的,因此它是只读的。

为此,您需要按以下方式扩展类:

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)

然后会返回help(func)的以下内容:

Help on function func in module __main__:

func(...)
(END)

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

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

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

Signature

生成结果:

def func(x, y):
    pass

func.__signature__ = object()

help(func)

但现在Help on function func in module __main__: func(...) (END) 会提升inspect.signature(func)

注意:这最后一个版本非常hacky,我不推荐它。

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

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

TypeError: unexpected object <object object at 0x10182e200> in __signature__ attribute