Python的方式与常识。类型检查

2024-06-26 19:41:18 发布

您现在位置:Python中文网/ 问答频道 /正文

我见过很多问题,比如下面的问题: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中的一个。在

从功能的角度看,我的断言很有前途。在

还有别的主意吗?在


Tags: to代码inclient类型defcheckok
1条回答
网友
1楼 · 发布于 2024-06-26 19:41:18

我想您要找的是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插件或分析器或其他工具一起使用(如果不是今天,那么很快)。在

相关问题 更多 >