[英]Pycharm Type-Hinting of Class Fields / Instance Variables
每当我们需要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节点
首先,正如您的问题中的一位评论者指出的那样,使用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
它是动态类型语言的限制。 类型的静态分析只能在某种程度上进行。 因此,不要期望与静态类型语言一样多的自动完成。
你应该遵循intellij程序:
https://www.jetbrains.com/help/pycharm/type-hinting-in-product.html
例:
class SomeClass(object):
__logger = None # type: Logger
def __init__(self):
self.__logger = logging.getLogger('root')
def some_method:
self.__logger.info('hint completion is working here :P')
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.