2011-04-27 38 views
3

要问我非常具体的问题,我发现我需要相当长的介绍来激励和解释它 - 我承诺最后有一个适当的问题!如何记录和测试Python 2中形式参数所需的接口?

在阅读大型Python代码库的一部分时,有时会遇到代码,其中参数所需的接口在同一模块或包中的“附近”代码中不明显。举个例子:

def make_factory(schema): 
    entity = schema.get_entity() 
    ... 

可能有许多“模式”和“工厂”,与代码交易,“高清get_entity()”可能是相当普遍太(或者功能不调用模式上的任何方法,但只是将它传递给另一个函数)。因此,快速grep并不总是有助于更多地了解“模式”是什么(对于返回类型也是如此)。虽然“鸭子打字”是Python的一个很好的特性,但是有时候读者关于作为“模式”传入的参数界面的不确定性妨碍了对代码的快速理解(同样,对于典型混凝土的不确定性实现接口的类)。查看自动化测试可以提供帮助,但明确的文档可能会更好,因为阅读速度更快。任何这样的文档都是最好的,因为它本身可以进行测试,以便它不会过时。

Doctests是解决这个问题的一种可能方法,但这不是这个问题的关键。

Python 3具有“参数注释”功能(功能注释功能的一部分,在PEP 3107中定义)。该功能可能被放置的用途不是由语言定义的,但可用于此目的。看起来像这样:

def make_factory(schema: "xml_schema"): 
    ... 

在这里,“xml_schema”标识传递给该函数的参数应该支持的Python接口。在其他地方,将会有代码根据属性,方法&它们的参数签名等来定义该接口,以及允许自省来验证特定对象是否提供接口(可能使用诸如zope.interface/zope.schema之类的实现来实现)的代码。请注意,这并不一定意味着每次传递参数时都会检查接口,也不会执行静态分析。相反,定义接口的动机是提供编写自动化测试的方法,以验证此文档是否过时(它们可能是相当通用的测试,因此您不必为每个函数编写新的测试使用这些参数,或者你可能会打开运行时接口检查,但只有当你运行你的单元测试时)。你可以进一步注释返回值的接口,我不会说明。

所以,问题:

我想要做的正是这一点,但使用Python 2而不是Python 3的Python 2中不具备的功能注释功能。 Python 2中“最接近的东西”是什么?显然有不止一种方法可以做到这一点,但我怀疑有一种(相对)明显的做法。

对于额外的要点:命名一个库,实现一个明显的方式。

回答

0

最接近的是我相信一个名为PyAnno的注释库。

从项目网页:

“的Pyanno注解有两个功能:

  • 提供一个结构化的方式来记录Python代码
  • 执行有限的运行时检查”
+0

该项目提供了检查类型的方法,而不是文档界面。此外,它使用包装装饰函数的装饰器。我不是在这里使用装饰器的先验,但是如果它们用于这个目的,他们应该可以修改装饰的函数对象然后返回它,而不是将装饰的函数包装在一个新的函数中 - 否则,对于那些只是文档而且可能遍布整个代码库的东西来说,这是非常干扰的。 – 2011-04-27 21:00:54