首页 > 编程问答 >类字段/实例变量的 Pycharm 类型提示

类字段/实例变量的 Pycharm 类型提示

时间:2024-07-31 07:04:44浏览次数:14  
标签:python pycharm python-typing

每当我们在 Java 中需要一个新对象时,我们都会声明类型和名称,选择是否为其提供初始值。在Python中我们不能这样做,因为我们没有声明类型。

我怎样才能解决这个问题,因为如果没有声明类型;我没有收到任何代码完成提示。就像特定对象的字段或我们可以在该对象上调用的任何方法一样...

 class Album:
    def __init__(self, name, Photo, next):
        self.name = name
        self.Photo = None
        self.next = next

    def __str__(self):
        return "Album name is: " + self.name


class Photo:
    def __init__(self, name, caption, Tag, next):
        self.name = name
        self.caption = caption
        self.Tag = Tag
        self.next = next

    def __str__(self):
        return "Photo name is: " + self.name + " with caption: " + self.caption


class Tag:
    def __init__(self, type, info, next):
        self.name = type
        self.info = info
        self.next = next

    def __str__(self):
        return "Photo name is: " + self.name


def addPhoto(toEdit, photoName, caption):

   if isinstance(toEdit, Album):    
        if toEdit.Photo is None:
            toEdit.Photo = Photo(photoName, caption, None, None)    
        else:

            tempPhoto = toEdit.Photo
            prev = None
            isFound = False 
            while tempPhoto != None:

                if tempPhoto.name.lower() == photoName.lower():
                    isFound = True
                    break

                prev = tempPhoto
                tempPhoto = tempPhoto.next

            if isFound == False:
                prev.next = Photo(photoName, caption, None, None)

            else:
                print("Photo " + photoName + " already exists in " + toEdit.name)


def deletePhoto(toEdit, photoName): 
    if isinstance(toEdit, Album):
        if photoName in toEdit.Photo.name:
            if toEdit.Photo.next is not None:
                toEdit.Photo = toEdit.Photo.next
                return True

            else:
                toEdit.Photo = None
                return True
        else:
            Photo = toEdit.Photo.next
            Photo_prev = None

            while Photo is not None:
                if Photo.name in photoName:
                    prev.next = Photo.next

                prev = Photo
                Photo = Photo.next

        print("Removed photo: " + photoName + " from " + toEdit.name)

pPtr = album1.Photo  
while (pPtr != None):
    print(pPtr)
    pPtr = pPtr.next

因此,每当我尝试执行 pPtr = album1.Photo 然后尝试访问该对象的任何字段 pPtr 时,我在 PyCharm 中都没有得到任何建议。我需要知道我是否做错了,或者 PyCharm 是否有问题。

实现是一个巨大的链表。相册节点包含照片节点,照片节点包含标签节点


你绝对走在正确的道路上!PyCharm 的力量在于它的代码完成和类型提示。你没有做错什么,只是需要让 PyCharm 了解你的代码的结构,以便它为你提供帮助。这就是 Python 类型提示的用武之地。

让我们分解一下如何改进你的代码:

  1. 类型提示: 通过在你的函数参数和返回值中添加类型提示,PyCharm 可以准确地知道你正在使用什么类型。

```python from typing import Optional

class Album: def init (self, name: str, Photo: Optional['Photo'] = None, next: Optional['Album'] = None): self.name: str = name self.Photo: Optional['Photo'] = Photo self.next: Optional['Album'] = next

   def __str__(self) -> str:
       return "Album name is: " + self.name

class Photo: def init (self, name: str, caption: str, Tag: Optional['Tag'] = None, next: Optional['Photo'] = None): self.name: str = name self.caption: str = caption self.Tag: Optional['Tag'] = Tag self.next: Optional['Photo'] = next

   def __str__(self) -> str:
       return "Photo name is: " + self.name + " with caption: " + self.caption

class Tag: def init (self, type: str, info: str, next: Optional['Tag'] = None): self.name: str = type self.info: str = info self.next: Optional['Tag'] = next

   def __str__(self) -> str:
       return "Photo name is: " + self.name

def addPhoto(toEdit: 'Album', photoName: str, caption: str) -> None: if toEdit.Photo is None: toEdit.Photo = Photo(photoName, caption, None, None) else: tempPhoto: Optional['Photo'] = toEdit.Photo prev: Optional['Photo'] = None isFound: bool = False while tempPhoto is not None: if tempPhoto.name.lower() == photoName.lower(): isFound = True break prev = tempPhoto tempPhoto = tempPhoto.next

       if isFound is False and prev is not None:
           prev.next = Photo(photoName, caption, None, None)
       else:
           print("Photo " + photoName + " already exists in " + toEdit.name)

def deletePhoto(toEdit: 'Album', photoName: str) -> Optional[bool]: if toEdit.Photo is not None and photoName in toEdit.Photo.name: if toEdit.Photo.next is not None: toEdit.Photo = toEdit.Photo.next return True else: toEdit.Photo = None return True else: Photo: Optional['Photo'] = toEdit.Photo.next if toEdit.Photo is not None else None Photo_prev: Optional['Photo'] = None

       while Photo is not None:
           if Photo.name in photoName:
               if Photo_prev is not None:
                   Photo_prev.next = Photo.next 
               return True

           Photo_prev = Photo
           Photo = Photo.next

   print("Removed photo: " + photoName + " from " + toEdit.name)
   return False

```

  1. 前向引用: 当你在类定义内部引用尚未定义的类时,Python 需要知道。你可以通过将类名放在字符串中来做到这一点,例如 'Photo'

  2. 可选类型: 当一个变量可以是 None 或特定类型时,使用 Optional[type]

通过这些更改,PyCharm 将能够:

  • 提供准确的代码完成建议,显示 pPtr 上可用的字段和方法。
  • 检测类型错误,例如尝试将字符串分配给应该是一个 Photo 对象的变量。
  • 使你的代码更易于阅读和理解,尤其是对于大型项目。

一个例子:

在你应用了类型提示后,当你输入 pPtr. 时,PyCharm 会立即显示 name caption Tag next 作为可用的选项,因为 PyCharm 现在知道 pPtr 是一个 Photo 对象。

其他提示:

希望这对你有帮助!

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

相关文章

  • 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......
  • 迟滞建模作为 Python GEKKO 中 MPC 的控制约束
    我试图使用PythonGEKKO在用于控制信号调度的MPC优化问题中引入滞后约束。这已成为一项艰巨的任务,因为我无法将以下问题转换为GEKKO理解的方程。问题:如果开启时间<最短开启时间,则给定资产的控制调度不应将其关闭。如果关闭时间<最小关闭时间......
  • 在 Lambda Python 中获取 errorMessage": "期望值: 第 1 行第 1 列 (char 0)"
    我正在尝试使用slackapi和awslambda函数创建一个slack机器人。现在我只希望每当用户说“你好”时它就响应“你好”。当我在Lambda代码编辑器中测试代码时,出现此错误。我对Lambda很陌生,并且已经被困在这个问题上有一段时间了。非常感谢任何帮助!完整错误:Response......
  • 具有 Python lambda 函数的 QTimer 使用先前的数据运行
    我有一个GUI项目,它使用PySide2和Python3.8,它在QThread中执行一些后台任务。在该QThread中,我有QTimer成员对象,该对象必须定期运行一个函数,每次向其传递不同的数据。我没有使用QTimer.singleShot静态函数,因为如果需要某些特定场景,我需要......
  • 我如何在 python 上使用 spire.pdf 修复此错误
    我使用spirepdf,但出现以下错误:“DllNotFound_Windows,libSkiaSharp,Nosepuedeencontrarelmóduloespecificado.:....”defextract_text_from_pdf(file_path,output_file):#LoadaPDFdocumentdoc=PdfDocument()doc.LoadFromFile(file_path)ex......
  • C++ 函数返回极其缓慢,远慢于功能等效的 python 代码
    我有一个在我编写的脚本中使用的函数,用于从列表中删除多余的阻塞关键字。基本上,输入(以任何顺序):{"apple","bapple","banana","cherry","bananaman","sweetherrypie","sweet","b"}它应该输出一个缩小的字符串数组(以任何顺序):......