kwargs和函数签名是什么意思?

5

有没有一种方法为带有 **kwargs 的函数提供签名参考(例如,用于 IDE)?

例如:

def foo(**kwargs):
  # call some third-party library with kwargs signature

我希望为大多数最新的IDE提供自动完成功能。

那么,在Python中如何描述签名呢?


我认为除了在签名中明确指定并避免使用 **kwargs 之外,没有任何简单的方法来做到这一点。这也有点取决于IDE如何获取函数签名——它是解析AST还是实际导入模块? - mgilson
我也这样认为,不过我猜应该有一种方法来描述它。或许是某种形式的注释。 - kharandziuk
如果你正在寻找魔法注释,那完全取决于IDE。python3.x添加了函数注释,某些IDE可能能够自省,但这并不能比直接编写描述kwargs更容易... - mgilson
2个回答

2

这可能不完全符合您的要求,但它可能会有所帮助

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函数来查看包装函数的文档字符串。


1
这种方法还有一个优点:Python文档字符串支持内置于许多,如果不是大多数兼容Python的IDE中。 - dreftymac

1
自Python 3.3起,您可以将任何自定义签名分配给function.__signature__。尽管如此,这是运行时行为。因此,如果IDE仅查看AST,则无法正常工作。但实际导入模块的任何内容,例如在Python REPL中执行help()或在模块上运行pydoc,将正常工作。
以下示例仅从“包装”函数中检索签名并将其分配给“包装”函数。
除了简单复制签名外,如果需要,还可以创建自己的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)

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接