如果您输入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
仍在显示,而不是...
答案 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