我看过很多问题,例如:What's the canonical way to check for type in Python?
并且总会有人回答这样的事情:“检查类型的pythonic方法不是检查它们。这里有另一篇关于鸭子打字的文章。”
首先,我确实理解鸭子打字的优点,而且我确实使用了很多。但检查类型真的值得吗?
假设我有以下代码:
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 /接受的技术来克服这样的事情?
我见过各种类型的跳棋,虽然我不喜欢将项目绑定到其中一个想法上的想法。
从我的观点来看,函数开头的断言看起来很有希望。
还有其他想法吗?
答案 0 :(得分:1)
我认为您正在寻找的是Mypy,这是Python 2.7 + / 3.4 +的静态类型检查器。它是Python 3.6注释系统的类型检查器,但他们一直小心翼翼地确保它可以与旧版本的Python一起使用。 (事实上,首先是类型提示的部分动机是Guido想要使用Mypy来帮助指导将大型代码库从2.7升级到3.5。)
当然,在旧版本的Python中你不能使用3.6语法。在3.5中,参数可以注释,但不能注释本地。在3.4中,注释是有限的。在2.7中,注释根本不存在。
如果你阅读了这些文档,有几种解决方法,但基本的想法是你将所有的注释放入" public"代码,当你写" typeshed"文件中包含"内部"的外部注释。代码。
好消息是,因为Mypy受到核心语言的祝福,其他静态类型的检查程序 - 以及IDE索引器或更深层的静态分析器等相关工具 - 正在适应以同样的方式做事,所以无论你使用什么2.7或3.4代码可能适用于您最喜欢的IDE或vim插件或分析器或其他任何东西(如果不是今天,那么很快)。