kwargs和功能签名

时间:2016-01-26 19:20:55

标签: python ide

有没有办法为** kwargs提供签名参考(例如,对于IDE)?

例如:

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

我想为最新的IDE提供自动完成功能

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

3 个答案:

答案 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的函数签名

解决方案

  • 如果不是大多数的话,很多python感知的IDE(或具有足够先进的python感知插件的IDE /编辑器)都可以解析和显示标准的python文档字符串
  • 同时指定字典(例如vinput**kwargs参数,还可以使用名称-值对参数或python字典来调用该函数,从而提高了方法调用的灵活性

示例

  • 在此示例中,我们仅使用YAML格式的文档字符串,并带有有关如何调用该函数以及相关参数的提示

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)