如何用动态类型语言描述函数参数?

时间:2012-04-29 12:58:57

标签: javascript python arguments dynamic-typing code-documentation

我的问题更倾向于Python,但也可能是关于JavaScript或其他脚本语言。

我通常使用静态类型语言(Java,C ++,ActionScript,...)进行开发。

我喜欢不时使用Python,我还需要有时使用JavaScript。这些是动态类型语言。这没有什么不对,但我通常有很多麻烦来理解函数或方法中需要哪些参数。它发生即使它是我自己的代码与一些docstrings!也许是因为眼睛必须在其他地方寻找而不是在函数的定义中。

当然,答案应该在文档中。但有时它根本不清楚,或者因为使用duck typing,文档本身很难写(“第一个参数是一个必须有quack()方法和羽毛(arg)的函数方法,其中arg是字符串“)。我非常喜欢的是语言本身内部的一种参数描述(即使它是可选的,就像在ActionScript中一样)。

明确描述函数/方法参数的最佳做法是什么?

如何创建一个特殊的装饰器(如果使用Python),其目的是在我们使用它时检查数据的类型(但是因为它将在运行时使用而不是在写入时使用,无论如何都应该是什么意思) ?

你认为这应该不是问题吗?那个比当前docstring更多的东西会让开发人员感到困惑,或者说我的思维太过于静态 - 打字??

2 个答案:

答案 0 :(得分:2)

我不了解Javascript,但是从版本3开始,Python有可选的function annotations,如下所示:

def haul(item: Haulable, *vargs: PackAnimal) -> Distance:

或:

def compile(source: "something compilable",
            filename: "where the compilable thing comes from",
            mode: "is this a single statement or a suite?"):

有关详细信息,请参阅the PEP

它们可以在运行时访问,甚至可以用于type checking

答案 1 :(得分:1)

为什么鸭子打字使文档很难写?

当你编写一个函数时,你会在假设参数是特定类型的情况下编写它或者确认某个特定的接口......所以只需记录它。

例如,如果您使用swim_in_pond(duck)方法,则无需记录“duck应该有quack()swim()dive()的文档方法“ - 在大多数情况下,完全可以说”duckDuck的实例“。或者,如果记录“Duck - like”界面很重要,我发现声明一个用作文档的基类很有帮助:

class DuckBase(object):
    def quack(self):
        """ Makes the duck quack. """

    def swim(self):
        """ Swims around.
            Assumes the duck is already in water.
            Updates the duck's position. """

    def dive(self):
        """ Dives either as deep as possible (either until the duck runs out of
            air, or it hits the bottom of the pond). """