如何记录鸭子类型?

时间:2011-11-09 02:18:06

标签: python documentation duck-typing

我有文件膨胀对我来说,因为每当我遇到复杂的鸭子类型时,我需要某种方式来说“这种鸭子类型”,而是陷入无休止的循环“你的功能需要这个输入,但不记录它,然后记录它。这会产生臃肿,重复的文档,例如:

def Foo(arg):
    """
    Args:
      arg: An object that supports X functionality, and Y functionality,
        and can be passed to Z other functionality.
    """
    # Insert code here.

def Bar(arg):
    """
    Args:
      arg: An object that supports X functionality, and Y functionality,
        and can be passed to Z other functionality.
    """
    # Insert code here.

依此类推,适用于BazQux和其他功能。我需要一些较短的写作方式“arg是一种(对象类型)”。

对于某些鸭子类型,它就像“类似dict的对象”一样简单:我们知道我们对dict的期望,因此,我们知道要传递什么。一个dict,或者可以模仿它的东西。

我觉得C ++与模板类型有同样的问题。 Haskell会拥有它,但是可以使用类型类的定义来记录它。 (注意:Haskell类!= Java / C ++ / Python等中的类。)(注意:我不是真的在Haskell中编程,所以如果它是一个糟糕的例子,请原谅我。)

我应该去传统的OO路线,只写一个基类,然后在文档中说“像这个基类一样的东西”?代码不会强制从基类派生(因为不需要从中派生对象),并且基类除了记录接口的属性外基本上不添加任何值。

另一方面,我正在编写Python,我尝试在语言的习语中编程。 (否则通常会伤害。)基类有利于继承功能,但是当你的基类完全是抽象的时,它似乎不会用鸭子类型的语言增加价值。


编辑:答案:我知道鸭子打字是什么(从帖子中可以看出这一点)。我在哪里记录它是问题,尤其是。当没有类可以将文档附加到。

2 个答案:

答案 0 :(得分:1)

鸭子打字的意义在于,“类型”的概念成为一种抽象的直觉概念,而不是正式的语言部分。这使得打字比在语言中使用类型检查的语言更加流畅和灵活。

使用duck typing时所需要的不是程序知道你正在使用什么“类型”,而是其他程序员。因此,如果你有一整套类/函数/等对特定“类型”的对象进行操作,并且该类型无法用几个词来描述,那么只需在注释或文档字符串中添加一个部分(甚至是外部.txt文件)描述您的类型并命名它。然后你可以在任何地方引用这个名字。

答案 1 :(得分:1)

更严格的类型语言,如Java,具有“接口”的概念:任何实现接口的类应该提供的方法集合。

我想你可以借用这个概念而不必带来严格打字的包袱:只需定义并记录一个抽象类Foo,然后说你的方法需要“a Foo或{ {1}} - 喜欢对象“。如果你不想,你甚至不必让任何其他类实际继承Foo;阅读文档的人仍然知道去哪里找出对Foo类对象的期望。