我是一名长期的 Python 开发人员,我真的很喜欢这种语言的动态特性,但我想知道 Python 是否会从可选的静态类型中受益。 能够将静态类型应用于库的 API 是否有益,这样做的缺点是什么?
我很快勾勒出了一个在 pastebin 上实现运行时静态类型检查的装饰器,它的工作方式如下:
# 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
使用这种技术有什么缺点?我在 pastebin上的幼稚实现的缺点是什么?
我不想要讨论将 Python 转换为静态类型语言的答案,而是关于 API 设计特定的优缺点的想法。(如果您认为这不是问题,请将其移至programmers.stackexchange.com)