有没有办法为** kwargs提供签名参考(例如,对于IDE)?
例如:
def foo(**kwargs):
# call some third-party library with kwargs signature
我想为最新的IDE提供自动完成功能
那么,我如何在Python中描述签名
答案 0 :(得分:1)
这不是你想要的,但它可能...... help
。
from other_package import my_function
def wrapped_help_text(wrapped_func):
"""Decorator to pass through the documentation from a wrapped function.
"""
def decorator(wrapper_func):
"""The decorator.
Parameters
----------
wrapped_func : callable
The wrapped function.
"""
wrapper_func.__doc__ = ('This method wraps the following method:\n\n' +
pydoc.text.document(wrapped_func))
return wrapper_func
return decorator
@wrapped_help_text(my_function)
def wrapper(**kwargs):
"""
Parameters
----------
**kwargs
See other_package.my_function()
"""
my_function(**kwargs)
有了这个,你现在可以调用内置的help
函数来查看包装函数的docstring。
答案 1 :(得分:0)
**kwargs
的函数签名vinput
和**kwargs
参数,还可以使用名称-值对参数或python字典来调用该函数,从而提高了方法调用的灵活性
def parse_hrefs_from_rawline(self,vinput={},**kwargs):
'''
- caption: parse_hrefs_from_rawline(rawline=line_of_text)
args:
- rawline ;; required ;; raw line of text to parse for href tokens
- formatas ;; optional ;; how to format the output formatas=JSON|XML|YAML
'''
# here we create an args variable for maximum flexibility
# on the ways this function/method can be called
vargs = dict()
vargs.update(vinput)
vargs.update(dict(kwargs.items()))
pass
## [function code goes here]
##enddef
答案 2 :(得分:-1)
从 Python 3.3 开始,您可以将任何自定义签名分配给 function.__signature__
。这是运行时行为。因此,如果 IDE 只查看 AST,这将不起作用。但任何实际导入模块的操作,例如在 Python REPL 中执行 help()
或在模块上运行 pydoc
都可以工作。
以下示例只是从“wrapped”函数中检索签名并将其分配给“wrapping”函数。
除了简单地复制签名之外,您还可以制作自己的 signature.Signature
对象或根据需要在分配之前修改签名。
import inspect
def wrapped(foo: str, a: int = 10) -> bool:
return True
def wrapping(*args, **kwargs) -> bool:
return wrapped(*args, **kwargs)
wrapping.__signature__ = inspect.signature(wrapped)