使函数在 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)
如果您键入 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)