当前位置: 首页 > 知识库问答 >
问题:

Pycharm静态类型检查器失败

邹俊拔
2023-03-14

也许有人能帮我解决这个问题。我已经用py魅力集成的这个静态类型检查器挣扎了很长时间。

一些规格:

  • Python 3.7.7
  • Windows 10 Pro x64

我尝试了以下PyCharm版本。

  • 专业2020.1.3
  • 社区2020.2.3

我试图说明问题。你可以复制

class SpecificCLS:
    pass


class CLS:
    def __init__(self):
        self.integer: int = 0
        self.specific_cls: SpecificCLS = SpecificCLS()

    def set_im_int(self, value: int):
        self.integer = value

    def get_im_int(self) -> int:
        return self.integer

    def get_specific_cls(self) -> SpecificCLS:
        return self.specific_cls

    def set_specific_cls(self, value: SpecificCLS):
        self.specific_cls = value


cls = CLS()

# Example for assigning a class into an integer
cls.integer = SpecificCLS()  # PyCharm does NOT show any error/warning that a class is assigned into an variable that is declared as an "int"
cls.set_im_int(SpecificCLS())  # PyCharm recognise an error (underlined red): Expected type 'int', got 'SpecificCLS' instead

# Example for assigning an integer into a class
cls.specific_cls = 1  # PyCharm does NOT show any error/warning that a class is assigned into an variable that is declared as an "int"
cls.set_specific_cls(1)  # PyCharm recognise an error (underlined red): Expected type 'SpecificCLS', got 'int' instead

PyCharm屏幕截图

如果您查看这一行,您会注意到没有显示错误。

cls.integer = SpecificCLS()  # PyCharm does NOT show any error/warning that a class is assigned into an variable that is declared as an "int"

如果我们使用setter方法来赋值,那么pycharm就可以正确识别错误的赋值。

cls.set_im_int(SpecificCLS())  # PyCharm recognise an error (underlined red): Expected type 'int', got 'SpecificCLS' instead

那么,有人能告诉我为什么setter的类型检查工作得很好,而其他任务却不行吗?

到目前为止,我一直使用getter/setter来验证是否将正确的类型分配给彼此。因此,我将字段标记为private,以便任何人都不能直接更改状态。因为我已经从python 3.5更新了。x至3.7。我想我可以删除这个模板代码。我希望有静态类型检查功能,但我不想强迫我一直使用getter/setter。

我感谢你的帮助。

最好的问候

2020年11月18日更新:12:00很抱歉,这是一个误导性的例子。我试着编辑剪报,希望现在问题已经清楚了。我还试图更详细地解释我在pycharm的执行/性能中看到了什么问题。我还添加了一个更新的屏幕截图。

共有2个答案

伯鸿达
2023-03-14

在@Sylvaus的帮助下,我找出了问题所在并找到了解决方案。

PyCharm不承认违反了PEP-526,但mypy做到了!通过安装Mypy插件

文件-

如果您运行mypy,它将告诉您现在有错误。但需要一段时间才能触发pycharms分析器并显示mypy的结果。

我将尝试将分析器绑定到代码格式快捷方式。如果我能做到的话,我会更新这篇文章。

编辑:感谢用户2235698,这是jetbrains发布的问题https://youtrack.jetbrains.com/issue/PY-36889

颜骁
2023-03-14

py魅力和mypy都是对的,因为bool派生自int,并且通过指示您想要一个int,您接受任何类型派生自int的变量。

您可以通过执行ISUBCLASS(bool,int)

 类似资料:
  • 本文向大家介绍Flow之一个新的Javascript静态类型检查器,包括了Flow之一个新的Javascript静态类型检查器的使用技巧和注意事项,需要的朋友参考一下 今天我们兴奋的发布了 Flow 的尝鲜版,一个新的Javascript静态类型检查器。Flow为Javascript添加了静态类型检查,以提高开发效率和代码质量。更明确的说,静态类型检查提供的好处像早期错误检查,帮助你发现一些只有在

  • 本文向大家介绍Dapper.NET 查询静态类型,包括了Dapper.NET 查询静态类型的使用技巧和注意事项,需要的朋友参考一下 示例 对于在编译时已知的类型,请使用带有的通用参数Query<T>。            

  • 本文向大家介绍JavaScript静态类型检查工具FLOW简介,包括了JavaScript静态类型检查工具FLOW简介的使用技巧和注意事项,需要的朋友参考一下 Flow是Facebook出品的,针对JavaScript的静态类型检查工具。其代码托管在github之上,并遵守BSD开源协议。 关于Flow 它可以帮助我们捕获JavaScript开发中的常见错误,而不需要额外地修改你原有的代码,比如静

  • 一个机器或语言是用来计算的,根据计算机模型的定义,其操作的是存储器里的数据,就现在流行的用二进制实现的计算机中(曾出现过三进制计算机),数据本质都是0和1,但机器毕竟是为人服务的,解决的是现实问题,它操作的数据需要有现实的含义,所以基本上所有语言都有类型系统,即便是汇编和机器语言,也有整数和浮点的区别 类型系统是很复杂的理论,值得用一本厚书来写,好点的资料有《类型与程序设计语言》,但我没看懂,因为

  • 代码静态检查 我们在代码静态检查中,使用 SonarQube 进行我们的代码质量管理。SonarQube 是一个开源的代码质量管理系统,它可以通过使用插件机制与 IDEA 、Maven 等其他外部工具集成,从而实现了对代码的质量的全面自动化分析和管理。

  • 本文向大家介绍Python静态类型检查新工具之pyright 使用指南,包括了Python静态类型检查新工具之pyright 使用指南的使用技巧和注意事项,需要的朋友参考一下 Python是一门动态类型的语言,民间流传一种说法叫”动态一时爽,重构火葬场”,听起来够吓人的,好在这门语言在不断地改进,包括对 PEP484 引入的类型提示(Type Hint),就是在某种程度上,让Python能够像静态