首页 > 编程问答 >类型提示在 pycharm 2018.1 中并不总是有效?

类型提示在 pycharm 2018.1 中并不总是有效?

时间:2024-07-31 07:32:28浏览次数:16  
标签:python pycharm python-typing

我今天开始使用类型提示。在阅读了有关类型提示的文档后,我尝试编写一些愚蠢的示例来检查它是如何工作的,但被困在像这样简单的事情上。

a: int = 7.33

我没有收到任何警告或错误。一切都正常,就像我没有使用类型提示一样。我期待一个警告,说浮点数不能分配给 int var。

我尝试过其他事情,例如:

def sum_two_numbers(a:int , b:int)->int:
    return a+b

def main() -> None:
    asd = sum_two_numbers(2, 5.4)

并且正如预期的那样,我在 5.4 数字中收到警告。 Pycharm 警告我传递的浮点数应该是 int。

那么,这里发生了什么?

编辑:我已经尝试过 mypy,它正确地检测到了我之前提到的问题。有没有办法让 pycharm 也检测到它?

干杯。


是对的,PyCharm 2018.1 不提供类型提示的运行时类型检查。虽然 PyCharm 可以在编写代码时推断类型并提供一些警告,但它不会将类型注释强制为运行时错误。

这是因为 Python 的类型提示旨在作为 静态分析 工具,主要用于像 MyPy 这样的工具,而不是在运行时强制执行。当你像这样声明一个变量时:

a: int = 7.33

只是在告诉类型检查器 a 应该是一个整数。但是,Python 仍然是一种动态类型的语言,它实际上会很乐意将 7.33 (一个浮点数)分配给 a ,而不会在运行时出错。

以下是可以做的选择:

  1. 使用 MyPy 进行静态分析: 如所述,MyPy 可以检测到此类类型错误。可以在的代码库上运行 MyPy,它会标记出任何类型违规。可以将 MyPy 集成到的 IDE 或构建过程中,以便在开发的早期阶段捕获这些错误。

  2. 升级 PyCharm: PyCharm 的更新版本可能包含对类型提示的改进支持。请考虑升级到最新版本,看看是否提供了任何相关的增强功能。

  3. 使用运行时类型检查库: 一些库,例如 typeguard enforce ,可以在运行时强制执行类型提示。但是,这些库确实会带来一些性能开销,并且可能会改变 Python 的动态特性。

总而言之,虽然 PyCharm 使用类型提示提供了一些代码洞察和警告,但它不会在运行时强制执行它们。对于更严格的类型检查,请考虑使用 MyPy 或运行时类型检查库。

标签:python,pycharm,python-typing
From: 49859151

相关文章

  • 激活虚拟环境会让python消失?
    VisualStudioCode终端的屏幕截图如屏幕截图所示,python在Powershell中运行得很好。然后我在E:\DrewFTCAPI\ftcapivenv激活虚拟环境,然后python就消失了。不仅没有消失,它不运行任何东西,也不产生任何输出。我至少预计会出现某种类型的"python"i......
  • Python 3.6 中的相互递归类型,使用命名元组语法
    我正在尝试实现图的节点和边。这是我的代码:fromtypingimportNamedTuple,ListclassNode(NamedTuple):name:stredges:List[Edge]classEdge(NamedTuple):src:Nodedest:Node这会引发错误,因为创建Edge时未定义Node类型。......
  • 使用 keras 模型对函数进行 Python 类型提示
    如果我创建这样的函数:defmdl(input_shape):model=Sequential()model.add(Conv2D(depth=64,kernel_size=(3,3),input_shape=input_shape,activation='relu'))model.add(Dense(32),activation='relu')model.add(Dropout(0.3))m......
  • Python:自动完成可以用于列表中的元素吗?
    Python在函数参数和函数返回类型中具有类型提示。类的元素是否有类似的东西?我希望能够在如下示例中使用自动完成功能:classMyClass:defhello(self):print("Hello")mylist=[]mylist.append(MyClass())foriinmylist:i.hello()#Noautocomplete......
  • 类字段/实例变量的 Pycharm 类型提示
    每当我们在Java中需要一个新对象时,我们都会声明类型和名称,选择是否为其提供初始值。在Python中我们不能这样做,因为我们没有声明类型。我怎样才能解决这个问题,因为如果没有声明类型;我没有收到任何代码完成提示。就像特定对象的字段或我们可以在该对象上调用的任何方法一样........
  • python 中 COM 对象的正确类型提示是什么?
    我在python中使用COM对象来向3rd方软件公开可编程接口。这是通过使用Dispatchfromwin32com.client来实现的。我的项目也一直在使用python.3.7中的类型提示,但是我不确定如何为了类型提示的目的定义这些COM对象的类型。这个问题涉及我拥有的所有COM......
  • 如何遍历Python字典同时避免KeyErrors?
    解析大型JSON时,某些键可能仅在某些情况下存在,例如出现错误时。从服务器的API获取200OK的情况并不少见,但是您得到的响应包含应检查的错误。处理此问题的最佳方法是什么?我知道使用类似||之类的东西。|是处理KeyError的一种方法。get()但是如果......
  • Python 中的递归数据类型
    Python中最接近Haskell中的递归数据类型的是什么?(即在定义自身时使用类型自己的定义。)编辑:为了给出递归类型的更具体定义,下面是Haskell中的二叉树:dataTreea=Leafa|Branch(Treea)(Treea)我的阅读方式如下:二叉树可以是叶子,也可以包含两......
  • 如何在Python中平滑相邻的多边形?
    我正在寻找一种平滑多边形的方法,以便相邻/接触的多边形保持接触。单个多边形可以轻松平滑,例如使用PAEK或Bezier插值(https://pro.arcgis.com/en/pro-app/latest/tool-reference/cartography/smooth-polygon.htm),这自然会改变它们的边界边缘。但是如何平滑所有多边形......
  • Python多处理池不启动多个进程
    我正在尝试使用多处理池来创建多个进程。我有一个工作函数dummy_proc定义如下:importrefrommultiprocessingimportPooldefregex_check(input_string):#Patterntomatchboth"pm_lat"and"pm_lon_coslat"followedbytwofloatspattern=r"(c......