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

 渊博的樱桃cherry 发布于 2023-01-04 10:02

每当我们需要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有问题.

实施是一个巨大的链接列表.相册节点包含包含标记节点的Photo节点

1 个回答
  • 首先,正如您的问题中的一位评论者指出的那样,使用upper_case变量名将它们与类/类型混淆.如果你看看你的问题,你会发现它甚至混淆了Stackoverflow代码格式化程序.

    此外,在您的Album构造函数中,您使用本地参数屏蔽全局变量"Photo".这可能会使PyCharm感到困惑,尤其是当你执行以下操作时.因此,对于我在下面的答案+测试,我将您的参数重命名为小写照片,以便它不会干扰.

    **编辑:**我找到了更好的方法.请参阅"正确的方法".

    第一次尝试

    class Album:
        def __init__(self, name, photo, next):
            self.name = name
            self.photo = self.get_photo(photo)
            self.next = next
    
        def get_photo(self, photo):
            """
            @rtype: Photo
            """
            return photo
    
        def __str__(self):
            return "Album name is: " + self.name
    

    它的工作方式是使用PyCharm类型推理.请参阅此处了解其工作原理的详细信息.

    在它工作的截图下面:

    答案工作的形象

    注意:我不建议这样做,因为它是一个黑客.当我试图找出在PyCharm中有更好的方法时,我遇到了你的问题.

    正确的方式

    这样做的正确方法是为PyCharm提供构造函数中变量的类型.本质上,从上面的方法移动类型绑定,并作为文档字符串条目"类型"的一部分进入构造函数.

    class Album:
        def __init__(self, name, photo, next):
            """
            @type name: str
            @type photo: Photo
            @type next: str
            """
            self.name = name
            self.photo = photo
            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
    
    photo1 = Photo("name.txt", "caption", "tag", "next")
    
    album1 = Album("TestAlbum", photo1, "next")
    
    album1.photo.#code completion working here
    

    2023-01-04 10:04 回答
撰写答案
今天,你开发时遇到什么问题呢?
立即提问
热门标签
PHP1.CN | 中国最专业的PHP中文社区 | PNG素材下载 | DevBox开发工具箱 | json解析格式化 |PHP资讯 | PHP教程 | 数据库技术 | 服务器技术 | 前端开发技术 | PHP框架 | 开发工具 | 在线工具
Copyright © 1998 - 2020 PHP1.CN. All Rights Reserved 京公网安备 11010802041100号 | 京ICP备19059560号-4 | PHP1.CN 第一PHP社区 版权所有