如何记录鸭子类型?

Tha*_*tos 14 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.
Run Code Online (Sandbox Code Playgroud)

等等,等等,对Baz,Qux等功能.我需要一些较短的写作方式" arg是一种(对象类型)".

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

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

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

另一方面,我正在编写Python,我尝试在语言的习语中编程.(否则通常会受到伤害.)基类适用于继承功能,但是当您的基类完全是抽象的时,它似乎不会在duck-typed语言中增加值.


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

Ray*_*ger 7

鸭子打字背后的想法是你记录你期待一只鸭子,并且由其他对象来假装成鸭子.

在文档中没有任何API指定它接受StringIO对象.相反,我们在大多数地方都期望一个类似文件的对象.

此外,在大多数情况下,标准库试图避免命名鸭类型的特定方法需求.这使得实施可以改变.例如,random.sample API可以根据迭代或序列来定义.

如果您想要更具体,可以使用抽象基类.一些已经包含在集合模块(例如Iterable,Hashable和Sized)或数字模块(Rational,Integral等)中.在那些写下来之后建模并不难.然后,文档简单地提到需要哪些ABCs(即x大小的 Iterabley整数).