python / python/cpython

Misleading "Not an instance or subtype" error when assigning to property of frozen, slotted dataclass

未關閉
#143,969 6 則留言 2 個 reaction 已指派 1 人 在 GitHub 檢視

@sobolevn 已經在處理了。

開始於 2026年5月19日。

stdlib topic-dataclasses type-bug
主要語言
Python
星號
77.2k
分支
35.9k
PR 合併指標
PR 指標待擷取

描述

Bug report

Bug description:

When a dataclass is frozen, attempting to assign to a property (with a setter or without) fails as expected:

from dataclasses import dataclass

@dataclass(frozen=True)
class Example:
	a: int

	@property
	def prop(self):
		return None

example = Example(10)
example.prop = 0
  File "test_dataclass.py", line 12, in <module>
    example.prop = 0
    ^^^^^^^^^^^^
  File "<string>", line 15, in __setattr__
dataclasses.FrozenInstanceError: cannot assign to field 'prop'

And when the class is slotted, if the property has no setter, it also fails the way one would expect:

from dataclasses import dataclass

@dataclass(slots=True)
class Example:
	a: int

	@property
	def prop(self):
		return None

example = Example(10)
example.prop = 0
Traceback (most recent call last):
  File "test_dataclass.py", line 12, in <module>
    example.prop = 0
    ^^^^^^^^^^^^
AttributeError: property 'prop' of 'Example' object has no setter

(In this case, of course, adding a setter makes it work fine.)

What's unexpected (and confusing) is when the class is both frozen and slotted:

from dataclasses import dataclass

@dataclass(frozen=True, slots=True)
class Example:
	a: int

	@property
	def prop(self):
		return None

example = Example(10)
example.prop = 0
Traceback (most recent call last):
  File "test_dataclass.py", line 12, in <module>
    example.prop = 0
    ^^^^^^^^^^^^
  File "<string>", line 16, in __setattr__
TypeError: super(type, obj): obj (instance of Example) is not an instance or subtype of type (Example).

One would, of course, expect an instance of Example to in fact be an instance of Example, but maybe this is somehow a collision between the initial vs. dataclass-ified class definitions?

CPython versions tested on:

3.13

Operating systems tested on:

macOS

Linked PRs
  • gh-143971

貢獻指南

開啟貢獻指南

從這裡開始

  1. 先讀完整個 Issue,再讀專案的貢獻指南。
  2. 在 Issue 下留言說明你要接手 —— 這能避免兩個人做同樣的事。
  3. Fork 儲存庫,在一個分支上完成修改。
  4. 送出 Pull Request,並在描述裡引用這個 Issue 編號。

評估

這個 Issue 還沒有評估資料。

把新 issue 寄到你的電子郵件信箱

精選適合新手參與的 GitHub issue 摘要。