我见过很多问题,比如下面的问题:What's the canonical way to check for type in Python?
总有人会这样回答:“Python式的检查类型的方法不是检查它们。这是另一段关于鸭子打字的文章。”
首先,我确实了解duck类型的优点,而且我经常使用它。但不检查类型真的值得吗?在
假设我有以下代码:
class DuckA:
def quack():
print("QuackA")
class DuckB:
def quack():
print("QuackB")
def duck_creator():
return DuckA()
def duck_client(duck):
duck.quack()
if __name__ is "__main__":
duck_client(DuckA()) #ok
duck_client(DuckB()) #ok
duck_client(duck_creator()) #ok
#totally fine untill you actually call it,
#which might be quite tricky to check in
#relatively big project
duck_client(duck_creator)
#one more typo, which is pretty hard to spot
#from first sight
duck_client(DuckB)
是的,我确实意识到我们都是工程师,因此,我们可以编写足够的结构,但是各种类型的打字错误呢?在
我是python的初学者,我来自c/c++人群。基本上,所有这些涉及鸭子输入的答案对我来说都有点像“如果你不想花几个小时在调试器上,你只需要编写代码而不出错”。在
那么,python专家们,有没有任何有效的/pythonic/可接受的技术来克服这些问题呢?在
我见过各种类型的类型检查程序,它们已经足够好了,尽管我不喜欢将项目绑定到这些IDE中的一个。在
从功能的角度看,我的断言很有前途。在
还有别的主意吗?在
我想您要找的是Mypy,一个Python2.7+/3.4+的静态类型检查器。python3.6的注释系统就是围绕着这个类型检查器设计的,但是他们一直在小心地确保它可以与旧版本的Python一起使用。(实际上,类型提示的部分动机首先是因为Guido希望使用Mypy来帮助指导将大型代码库从2.7升级到3.5。)
当然,在旧版本的Python中不能使用3.6语法。在3.5中,参数可以被注释,但不能是局部变量。在3.4中,注释是有限的。在2.7中,注释根本不存在。在
如果您阅读文档,有几种方法可以解决这个问题,但基本思想是您将所有注释放入“public”代码中的注释中,同时为“internal”代码编写充满脱机注释的“typeshed”文件。在
好消息是,由于Mypy受到了核心语言的青睐,其他静态类型检查程序和相关工具(如IDE索引器或更深层的静态分析器)也在采用相同的方法来执行任务,因此无论您在2.7或3.4代码中使用什么,都可能会与您最喜欢的IDE或vim插件或分析器或其他工具一起使用(如果不是今天,那么很快)。在
相关问题 更多 >
编程相关推荐