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

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

问题描述:

我的问题更多面向Python,但也可能是关于JavaScript或其他脚本语言。如何在动态类型语言中描述函数参数?

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

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

当然,答案应该在文档中。但有时并不清楚所有,或因为使用鸭的键入文档本身可以是很难写(“第一个参数是必须有一个庸医()方法和羽毛(ARG)方法,其中一个功能arg是一个字符串“)。我非常喜欢的是在语言本身内部的一种参数描述(即使它是单独的,就像ActionScript一样)。

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

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

你认为这不应该是一个问题吗?做比当前的文档字符串更多会混淆开发人员,或者我的思想太静态输入导向?

+0

忘掉这样的装饰。这对文档没有用处,非常复杂(如果正确完成),引入大量开销,即使那样也会危及鸭子打字,并且不会给你带来类型检查的任何好处(检查而不运行程序,上述文档,优化等) )。你介意*是*“太过静态输入”。 – delnan 2012-04-29 13:21:07

+0

也许它确实是:)但是我有时会觉得花时间去理解一些Python库的文档,只是为了知道我必须给出什么论点;而我只需要用静态类型来查看函数/方法签名。我知道动态类型允许打破静态类型语言的一些限制,但是,如果它意味着对图书馆的使用不清楚,我觉得我会失去一些时间。 – 2012-04-29 18:01:38

我不知道有关JavaScript,但Python有可选function annotations自3版本,它看起来像:

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

+0

我相信OP在询问他应该使用的写作风格,而你建议他可以写作的地方......所以我不确定这是否真的回答了这个问题。 – 2012-04-29 13:08:35

+0

他问:“如何创建一个特殊的装饰器(如果使用Python),目的是在我们使用它时检查数据的类型(但是因为它将在运行时使用,而不是在写入时,反正会有什么意义)?” - 功能注释解决了这个问题,因为它可以同时用于两种用例。 – ch3ka 2012-04-29 13:12:59

+0

啊,你是对的 - 请原谅我错过了那部分。 – 2012-04-29 13:13:37

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

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

例如,如果你有一个swim_in_pond(duck)方法,没有必要记录“duck预计将有quack()swim()dive()方法” - 在大多数情况下,这是完全足够的说“duckDuck实例”。或者,如果你记录了“Duck样”的界面是非常重要的,我发现它有利于声明基类作为文档:

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). """ 
+0

这实际上是鸭打字? – 2012-04-29 13:13:54

+0

@DanRoberts如果'swim_in_pond'接受任何带有(丢失,非正式定义的)接口的对象,它就是。 – delnan 2012-04-29 13:22:34