首页 > 编程问答 >PyCharm 在有效代码上显示“无法读取属性”

PyCharm 在有效代码上显示“无法读取属性”

时间:2024-07-30 14:32:29浏览次数:15  
标签:python pycharm python-typing

我们来看下面的代码:

import typing

def make_getter(field: str) -> typing.Callable[['A'], int]:
    def getter(self: 'A') -> int:
        return int(self.dict[field])
    return getter

def make_setter(field: str) -> typing.Callable[['A', int], None]:
    def setter(self: 'A', value: int):
        self.dict[field] = str(value)
    return setter

class A:
    def __init__(self, d: dict):
        super().__init__()
        self.dict = d

    get_x = make_getter('foo')
    set_x = make_setter('foo')
    x = property(get_x, set_x)

    def get_y(self) -> int:
        return int(self.dict['bar'])
    def set_y(self, value: int):
        self.dict['bar'] = str(value)
    y = property(get_y, set_y)

我定义了2个属性: x y 两者都应该工作正常,没有任何问题,两者应该具有相同的行为。 接下来,以下代码:

a = A(dict())
a.x = 10
print(a.x)
a.y = 20
print(a.y)

PyCharm 编辑器显示: “属性无法读取” on a.x 但这段代码执行得很好,没有任何问题。

第一个想法是 PyCharm 错误地推断了类型。 但是看看我录制的这个短视频。 我看不出类型有任何问题。|| |另外:

它的输出:

print(repr(a.get_x), repr(a.get_y))
print(repr(A.get_x), repr(A.get_y))
print(repr(A.x), repr(A.y))

...所以

<bound method make_getter.<locals>.getter of <__main__.A object at 0x7f7d25145f28>> <bound method A.get_y of <__main__.A object at 0x7f7d25145f28>>
<function make_getter.<locals>.getter at 0x7f7d25132e18> <function A.get_y at 0x7f7d25132f28>
<property object at 0x7f7d25143c78> <property object at 0x7f7d25143cc8>

x 几乎等效。 y 为什么 PyCharm 这么说?

我做错了什么或者这是一种错误?如何修复它(不禁用此类警告)? I did something wrong or it's kind of bug? How to fix it (w/o disabling this type of warning)?


这是一个 PyCharm 已知问题,与它处理通过 @property 装饰器或内置 property() 函数创建的属性的方式有关,尤其是在涉及类型提示时。尽管代码在运行时可以正常工作,但 PyCharm 的静态分析器有时无法正确推断类型,从而导致误报“无法读取属性”警告。

以下是一些可能的解决方法:

1. 忽略该警告:

  • 最简单(但不太令人满意)的解决方法是在该特定行上禁用该警告。可以将鼠标悬停在警告上,然后单击出现的灯泡图标,然后选择“忽略此类问题”。

2. 添加类型提示到 property 对象:

  • 可以通过在类级别为 property 对象添加类型提示来帮助 PyCharm 更好地理解类型。

python class A: ... x: int = property(make_getter('foo'), make_setter('foo')) y: int = property(get_y, set_y)

3. 使用 @property 装饰器:

  • 尽管你的代码在功能上是正确的,但使用 @property 装饰器通常更清晰,并且可以提高 PyCharm 对类型的推断能力。

```python class A: ...

   @property
   def x(self) -> int:
       return int(self.dict['foo'])

   @x.setter
   def x(self, value: int):
       self.dict['foo'] = str(value)

   ...

```

4. 更新 PyCharm:

  • 这个问题可能在 PyCharm 的新版本中已经得到解决。尝试更新到最新版本,看看是否解决了该问题。

如果这些方法都不起作用,可以考虑向 JetBrains 提交错误报告,提供重现该问题的最小示例。

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

相关文章

  • 使用 Python + Beautiful Soup 抓取任何包含 5 个数字的字符串
    我住在德国,那里的邮政编码在大多数情况下都是5位数字。53525。我真的很想使用beautifulSoup从网站中提取该信息。我是Python/BeautifulSoup的新手,我不知道如何将“查找连续的每5个数字+“空格””翻译成Python语言。importrequestsimporturllib.re......
  • 如何测试 python 类型协议是另一个协议的子类?
    该问题的明显解决方案是使用issubclass,但这会引发TypeError(使用Python3.6.7),例如>>>fromtyping_extensionsimportProtocol>>>classProtoSubclass(Protocol):...pass...>>>issubclass(ProtoSubclass,Protocol)Traceback(mos......
  • Python:指定与继承一起使用的类方法的返回类型
    我一直在尝试了解如何在Python中指定类方法的返回类型,以便即使对于子类也能正确解释它(例如在我的Sphinx文档中)。假设我有:classParent:@classmethoddefa_class_method(cls)->'Parent':returncls()classChild(Parent):pass什么如......
  • python使用SMTP功能发送邮件
    网页格式发送for_email.html<!DOCTYPEhtml><htmllang="en"><head><metacharset="UTF-8"><title>Title</title><style>h1{color:brown;}p{margin:5px;color:purple......
  • python之代码简化式(列表、字典生成式,递归函数,迭代器(iter)和生成器(yield)、匿名函数(
    文章目录前言1、列表、字典生成式2、递归函数2.1python中代码的递归深度(扩展)3、拓展:迭代器和生成器3.1迭代器(iter)3.2生成器(yield)4、匿名函数(lambda)4.1map函数4.2reduce函数(较少使用)4.3filter函数前言本文主要讲解一些简化代码格式的一些方法,方便大家更好的......
  • Python:在 Protocol 和 TypedDict 之间共享类型注释
    举这个简单的例子:from__future__importannotationsimporttypingastclassMyType:def__init__(self,s:str,i:int)->None:self.s=sself.i=iclassMyProto(t.Protocol):s:stri:intclassMyDict(t.TypedDict):......
  • PIL 和 python 静态类型
    我有一个函数参数,它可以接受图像的多种类型:defsomefunc(img:Union[np.array,Image,Path,str]):PILImage在这种情况下抛出以下异常:TypeError:Union[arg,...]:eachargmustbeatype.Got<module'PIL.Image'from...进一步检查图像对象后这才有......
  • 高效率| PyCharm16大快捷键
    PyCharm作为一款强大的PythonIDE(集成开发环境),提供了丰富的快捷键来提高开发效率。以下是PyCharm中绝对不能错过的10大快捷键,这些快捷键将帮助你更高效地编写、查找、修改和运行代码。1.代码编辑快捷键快速导入任意类:Ctrl+Alt+Space运用:当你需要导入某个类......
  • 学会用Python爬取小说网站,想看什么就爬什么,广告也不用看了~
    今天以爬取笔趣阁小说网站为例,练习Python爬虫技术。通过这个爬虫,可以完成批量爬取一本小说的所有章节,并将所有章节内容按顺序保存到一个txt文档内,下面我们就开始吧。首先,百度搜索“笔趣阁”,发现有很多网站都叫笔趣阁。我们可以随便挑选一个网站尝试,本文我以‘https://......
  • 计算机毕业设计django+vue《Python数据分析》的教学系统【开题+论文+程序】
    本系统(程序+源码+数据库+调试部署+开发环境)带论文文档1万字以上,文末可获取,系统界面在最后面。系统程序文件列表开题报告内容研究背景在当今数字化时代,数据分析已成为各行各业不可或缺的技能之一,而Python作为数据分析领域的首选语言,其重要性日益凸显。然而,传统的教学模式在......