首页 > 编程问答 >变量类型注释导致警告

变量类型注释导致警告

时间:2024-07-23 14:26:12浏览次数:4  
标签:python pycharm python-typing python-3.4

我是 Python 开发新手,正在尝试解决问题。我正在使用 Pycharm 进行开发。我目前正在尝试注释变量的类型,以便通过自动完成和建议更轻松地访问。我尝试了代码的迭代,但结果不一。

这是有问题的代码:

path = os.path.dirname(os.path.realpath(__file__))  # type: str
components = path.split(os.sep)  # type: list[str]

显示的第一个问题位于第二行类型注释的左大括号处。它说:

Class 'type' does not define '__getitem__', so the '[]' operator cannot be used on its instances.

我用谷歌搜索了一下,虽然问题似乎很清楚,但打开 list 类的代码清楚地显示了一个方法 __getitem__

class list(object):
    """
    list() -> new empty list
    list(iterable) -> new list initialized from iterable's items
    """

....

    def __getitem__(self, y): # real signature unknown; restored from __doc__
        """ x.__getitem__(y) <==> x[y] """
        pass

好吧,也许这并不容易理解,而且有一些其他加载机制在工作。此外,“问题”似乎是我使用了 list[str] 而不是 List[str] 所以我改变了代码:

path = os.path.dirname(os.path.realpath(__file__))  # type: str
components = path.split(os.sep)  # type: List[str]

现在一切都中断了:第二行现在抱怨这个:

Expected type 'List[str]', got 'List[str]' instead`

之前关于 __getitem__ 的问题仍然存在。

有没有一种方法可以注释这些变量而不会给检查员?我对 Python 文档在这方面不太满意,没有明确说明其内置方法的返回类型。我必须依赖 Pycharm 在文档弹出窗口 (Ctrl+q) 中提供的信息。


遇到的问题与类型提示和 Python 版本的实现细节有关。以下是的问题的细分以及如何解决它们:

1. type 中的错误: __getitem__

list[str] 语法是在 Python 3.9 中引入的。如果使用的是早期版本,解释器不会将其识别为类型注释,而是尝试将其理解为对 type 对象(Python 中所有类型的元类)进行索引,从而导致错误。

2. List[str] 错误: Expected type 'List[str]', got 'List[str]' instead

这是 PyCharm 中的一个已知问题,有时类型检查器无法正确推断类型,即使它们是正确的。

解决方案

  • 升级到 Python 3.9 或更高版本: 这将解决第一个问题,并允许使用 list[str] 语法进行类型注释,而无需导入 List

  • 使用 from typing import List 对于 Python 3.9 之前的版本,需要从此模块导入 List 以进行类型提示。

  • 忽略 PyCharm 的类型检查错误: 如果升级 Python 版本不是一个选项,并且确定自己的类型注释是正确的,则可以暂时忽略 PyCharm 的错误。可以通过在有问题的行上使用 # type: ignore 来禁止显示特定错误。

修改后的代码(适用于所有 Python 3.x 版本):

from typing import List

import os

path = os.path.dirname(os.path.realpath(__file__))  # type: str
components = path.split(os.sep)  # type: List[str]

此代码应在所有受支持的 Python 3.x 版本中运行,并且 PyCharm 应该能够正确理解类型注释。

其他提示:

  • 启用类型提示: 确保在 PyCharm 设置中启用了类型提示 (Settings/Preferences -> Editor -> Inspections -> Python -> Type hinting)。
  • 安装类型提示存根: 对于没有类型提示的第三方库,可以安装类型提示存根包。这些软件包提供类型信息,可以帮助 PyCharm 进行类型检查和自动完成。可以使用 pip install mypy 安装 mypy,这是一个常用的类型检查器。

通过遵循这些步骤,应该能够在代码中使用类型注释,而不会遇到任何问题,并充分利用 PyCharm 的自动完成和建议功能。

标签:python,pycharm,python-typing,python-3.4
From: 58606569

相关文章

  • python 的注释(例如数据类)可以扩展到它生成的代码中吗?
    能看出python的注释扩展成​​什么吗?例如,对于与数据类相关的错误,有时试图找出它实际生成的代码有点棘手。例如:@dataclass(order=True)classPerson:name:strage:int=0classPerson:def__init__(self,name:str,age=0):self.name=name......
  • Pycharm社区版在外部安装了selenium,ddt在项目中却无法用(安装了第三方包pycharm无法识
    1.安装selenium的方法(1)找到存放selenium目录的文件夹,右击“在终端中打开”(2)在命令行中输入pipinstallseleniumXXX.whl(3)等待些许时间,等待到提示安装成功2在pycharm中创建项目能识别到安装到的包(1)点击file——》NewProject(2)勾选上Inherit globalsite-packag......
  • Docker:无法在 docker 映像中使用 pythonnet 和 |无法创建默认的 .NET 运行时,该运行时
    我正在尝试使用clrfromPythonnet使用.DLL引用将一种文件类型转换为另一种文件类型。这就是我的代码的样子-importclrclr.AddReference(dll_path)importRxLibrary#ConverttoASCFormat-----------input_file=f"./{filename}.rxd"......
  • 在 Python 中以非常高的质量保存图像
    如何以非常高的质量保存Python绘图?也就是说,当我不断放大PDF文件中保存的对象时,为什么没有任何模糊?另外,什么是最好的模式将其保存在?png,eps?或者其他的?我不能pdf,因为有一个隐藏的数字会扰乱Latexmk编译。要以非常高的质量保存Py......
  • Python字符串:提取重复和随机合并的子字符串
    重复和合并字符串的示例:16.01068.0%08p%.a.p.a.要提取的所需子字符串:16.008%p.a.完整示例:CCoonnttiinnggeennttCCoouuppoonn16.01068.0%08p%.a.p(.Ma.o(nMtholyn)thly)所需子字符串:ContingentCoupon16.008%p.a.(Monthly)我的问题是当原始......
  • Python Pandas 从使用第 3 部分 API 自动生成的 Excel 文件中读取不一致的日期格式
    我正在使用PDF4meAPI将PDF发票转换为Excel文件。API可以正确读取日期。但是,当我打开Excel文件时,日期显示不一致:某些日期以正确的格式(dd/mm/yyyy)显示,而其他日期以错误的mm/dd/yyyy格式显示。当该月的某天小于或等于12时,似乎会出现这种不一致。......
  • python-input键盘输入
     str=input("请输入:")#用户键盘输入#str表示一个字符串类型的变量,input会将读取到的字符串放入str中print(str) aa='请输入:'str=input(aa)#用户键盘输入#str表示一个字符串类型的变量,input会将读取到的字符串放入str中print(str)      ......
  • Python从0到100(四十五):从字符串到前后端分离
    前言:零基础学Python:Python从0到100最新最全教程。想做这件事情很久了,这次我更新了自己所写过的所有博客,汇集成了Python从0到100,共一百节课,帮助大家一个月时间里从零基础到学习Python基础语法、Python爬虫、Web开发、计算机视觉、机器学习、神经网络以及人工智能相关知......
  • Python的运算符与条件表达式
    一、运算符Python数据是通过使用运算符来进行操作的,与数学运算符类似,主要运用于数字计算,比较大小和逻辑运算。Python中的运算符主要包括算术运算符、赋值运算符、比较运算符、逻辑运算符和位运算符。1.算术运算符算术运算符用在数字表达式中,作用和在数学中是一样的。Python......
  • 在尝试使用 docker 运行基于 pythonnet 的项目时,找不到 C# 运行时
    屏幕截图我不断收到此错误:RuntimeError:Failedtocreateadefault.NETruntime,whichwouldhavebeen"mono"onthissystem.Eitherinstallacompatibleruntimeorconfigureitexplicitlyvia......