Ant*_*n B 3 python static-typing
我是一名长期的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)
Run Code Online (Sandbox Code Playgroud)
在库的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
Run Code Online (Sandbox Code Playgroud)
使用这种技术的缺点是什么?我的天真实现对pastebin的缺点是什么?
我不希望答案讨论将Python转换为静态类型语言的问题,而是关于API设计特定优缺点的想法.(如果您认为这不是问题,请将其移至programmers.stackexchange.com)
就个人而言,我并不觉得这个想法对Python很有吸引力.当然,这只是我的意见,但对于上下文我会告诉你Python和Haskell可能是我最喜欢的两种编程语言 - 我喜欢静态与动态类型谱的两端极端的语言.
我看到静态类型的主要好处如下:
您建议的系统并不能真正提供任何这些好处.
为了得到这么多,你已经牺牲了Python鸭子打字的灵活性; 仅仅提供一个足够"类似列表"的对象是不够的,我必须提供一个列表.
对我来说,这种静态打字是两个世界中最糟糕的.主要的动态类型参数是"你必须测试你的代码,所以你也可以使用这些测试来捕获类型错误,让你自己解决类型系统无法解决的问题".对于一个非常好的静态类型系统,这可能是也可能不是一个好的论据,但对于只在运行时检测类型错误的弱部分静态类型系统,它绝对是一个令人信服的论据.我不认为更好的错误消息(这大部分时间都是它真正购买的;在接口上没有捕获的类型错误几乎肯定会在调用堆栈中引发异常)值得失去灵活性.
| 归档时间: |
|
| 查看次数: |
370 次 |
| 最近记录: |