Python 如何记录鸭子类型?

Python 如何记录鸭子类型?,python,documentation,duck-typing,Python,Documentation,Duck Typing,我的文档膨胀了,因为每当我遇到一个复杂的duck类型时,我都需要用某种方式说“this duck type”,但却陷入了一个无休止的循环:“您的函数需要这个输入,但不记录它”,然后记录它。这会导致文件臃肿、重复,例如: def Foo(arg): """ Args: arg: An object that supports X functionality, and Y functionality, and can be passed to Z othe

我的文档膨胀了,因为每当我遇到一个复杂的duck类型时,我都需要用某种方式说“this duck type”,但却陷入了一个无休止的循环:“您的函数需要这个输入,但不记录它”,然后记录它。这会导致文件臃肿、重复,例如:

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.
等等,等等,用于
Baz
Qux
和其他功能。我需要一些简短的书写方式“
arg
是一种(对象类型)”

对于一些鸭子类型来说,这就像“类似dict的对象”一样简单:我们知道我们对dict的期望,因此,我们知道传递什么。一个
命令
,或能模仿它的东西

<>我觉得C++与模板类型有相同的问题。Haskell将拥有它,但可以使用类型类的定义来记录它。(注意:Haskell类!=Java/C++/Python/etc中的类)(注意:我并不是真的用Haskell编程,所以如果这是一个蹩脚的示例,请原谅。)

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

另一方面,我正在编写Python,我试图用一种语言的习惯用法进行编程。基类有利于继承功能,但当基类完全抽象时,它似乎不会在duck类型的语言中增加价值



编辑:答案:我知道什么是duck类型(这应该从帖子中可以明显看出)。我在哪里记录这是一个问题,尤其是当不存在可附加文档的类时。

duck类型背后的思想是,您记录您期望的duck,而其他对象则可以假装是duck

文档中没有任何API指定它接受StringIO对象;但是,我们可以在大多数需要“类似文件的对象”的地方使用它们

此外,在大多数情况下,标准库试图避免命名duck类型所需的特定方法。这使得实现有可能发生变化。例如,API可以用可重用性或序列来定义


如果您想更具体一些,可以使用。有几个已经包含在(例如Iterable、Hashable和Sized)或(Rational、Integral等)中。模仿这些来写你自己的并不难。然后,文档只提到需要哪些ABC(例如,x是a,y是a)。

duck类型的要点是,“类型”的概念变成了一个抽象的直观概念,而不是语言的一部分。这使得键入比在类型检查是语言一部分的语言中更加流畅和灵活


使用duck类型时需要做的不是程序知道您使用的是什么“类型”,而是其他程序员知道。因此,如果您有一整套类/函数/等,它们在特定“类型”的对象上运行,而该类型无法用几句话来描述,那么只需在注释中添加一个部分或一个docstring(甚至一个外部.txt文件)来描述您的类型并对其命名即可。然后你可以到处引用这个名字。

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


我想您可以借用这个概念,而不必带上严格类型的包袱:只需定义并记录一个抽象类
Foo
,然后说您的方法需要“一个
Foo
或一个类似
Foo
的对象”。如果您不想,您甚至不必让任何其他类实际继承自
Foo
;阅读文档的人仍然知道应该去哪里找到对类
Foo
-对象的期望。

我喜欢术语“行为类似”,并将文档化的需求保持为一般性的,除非有特定的原因公开更多细节。例如,如果只需要一个索引器和计数,我仍然会说“行为就像一个列表”。对于其他类型,它是相同的:“x表现得像动物”,其中“狗是动物”的想法可能在其他地方被记录/确认。@pst:是的,但是什么是动物,我们对动物有什么期望,我们在哪里记录它?
类动物
类狗
,有了他们自己的文档:)Python非常扎根于类实例模型中。