可选的静态类型对Python API设计是有利还是不利?(包括类型检查装饰器示例)
我是一名长期的Python开发人员,我非常喜欢这种语言的动态特性,但我想知道Python是否会从可选的静态类型中受益。 将静态类型应用于库的API是否有益,其缺点是什么? 我快速绘制了一个实现运行时静态类型检查的装饰器,其工作原理如下:可选的静态类型对Python API设计是有利还是不利?(包括类型检查装饰器示例),python,static-typing,Python,Static Typing,我是一名长期的Python开发人员,我非常喜欢这种语言的动态特性,但我想知道Python是否会从可选的静态类型中受益。 将静态类型应用于库的API是否有益,其缺点是什么? 我快速绘制了一个实现运行时静态类型检查的装饰器,其工作原理如下: # A TypeError will be thrown if the argument "string" is not a "str" and if # the returned value is not an "int" @typed(int, strin
# A TypeError will be thrown if the argument "string" is not a "str" and if
# the returned value is not an "int"
@typed(int, string = str)
def getStringLength(string):
return len(string)
在库的API函数上使用这样的装饰器是否切实可行?在我看来,类型检查在库的特定于域的模块的内部工作中是不需要的,但是在库与其客户机之间的连接点上,通过应用类型检查的简单版本的契约式设计可能是有用的。特别是作为一种强制文档,它向库的客户清楚地说明它期望和返回的内容
类似于此示例,其中addObjectToQueue()
和isObjectProcessed()
公开供客户端使用,而processTheQueueAndDoAdvancedStuff()
是一个内部库函数。我认为类型检查在面向外部的函数上可能很有用,但如果在内部函数上使用,它只会膨胀并限制python的动态性和实用性
# some_library_module.py
@typed(int, name = string)
def addObjectToQueue(name):
return random.randint() # Some object id
def processTheQueueAndDoAdvancedStuff(arg_of_library_specific_type)
# Function body here
@typed(bool, object_id = int)
def isObjectProcessed(object_id):
return True
使用此技术的缺点是什么?
我的幼稚实现的缺点是什么?
我不想要讨论Python向静态类型语言转换的答案,而是想了解API设计特有的优缺点。(请把这个移到程序员。StasExchange。com,如果你认为这不是问题) < P>个人,我不认为这个想法对Python有吸引力。当然,这只是我的观点,但从上下文来看,我会告诉你Python和Haskell可能是我最喜欢的两种编程语言——我喜欢静态类型和动态类型的两种极端语言 我认为静态类型的主要好处如下:
对我来说,这种静态类型是两个世界中最糟糕的。主要的动态类型参数是“您无论如何都必须测试代码,因此您也可以使用这些测试来捕获类型错误,并且在类型系统对您没有帮助时,您不必再处理它”。对于真正好的静态类型系统来说,这可能是一个好的参数,也可能不是一个好的参数,但是对于只在运行时检测类型错误的弱部分静态类型系统来说,它绝对是一个引人注目的参数。我认为,失去灵活性并不值得有更好的错误消息(这在大多数情况下都是它真正为您带来的;没有在接口上捕获的类型错误几乎肯定会在调用堆栈中引发更深层次的异常)。
使用此技术的缺点是什么?
失去duck类型。