有没有办法看到参数必须在python中实现哪个接口

时间:2018-02-04 10:33:56

标签: python interface duck-typing

给定方法:

def foo(bar):
    bar.buzz()
    bar.blep()

def bla(bee):
    bee.buzz()

现在,我们知道bar必须有buzzblep方法。但代码的客户端并不知道,除非他们打开实现并通读它(在这个例子中这很容易,但在现实世界中可能很棘手)。

一种解决方案是定义ABC,如下所示:

def BuzzBlepable(ABC):
    @abstractmethod
    def buzz():
        pass

    @abstractmethod
    def blep():
        pass

现在我们可以获得代码:

def foo(bar: BuzzBlepable):
    bar.buzz()
    bar.blep()

def bla(bee: BuzzBlepable):
    bee.buzz()

问题在于bla方法并不真正需要bee参数来实现blep方法,但我们无论如何都会强制客户端这样做。这引出了一个问题,是否有任何好的做法告诉客户端参数必须符合哪个接口?比如,自动生成的方法文档还是什么?有没有人有任何想法?

1 个答案:

答案 0 :(得分:1)

  

这引出了一个问题,是否有任何好的做法告诉客户   参数必须符合哪个接口?喜欢,自动生成   方法文档或什么?

我认为你想使用docstrings。 Docstrings可用于描述模块,类和方法。因此,您可以在docstring中描述函数所需的参数类型,然后在此类的docstring中描述类的方法。对于文档字符串有几种不同的讨论,你可以找到它们的讨论here

使用Google风格,您可以执行以下操作:

def foo(param1):
    """
    Description of the method

    Args:
        param1: Description of the param 

    """

然后,用户可以使用foo.__doc__help(foo)查看文档。 像PyCharm这样的IDE也能够自动生成这个文档字符串。或者,您可以使用Pyment等工具自动生成文档字符串。