-
-
Notifications
You must be signed in to change notification settings - Fork 34.2k
Closed
Labels
3.10only security fixesonly security fixes3.11only security fixesonly security fixes3.12only security fixesonly security fixesstdlibStandard Library Python modules in the Lib/ directoryStandard Library Python modules in the Lib/ directorytype-bugAn unexpected behavior, bug, or errorAn unexpected behavior, bug, or error
Description
Currently, if you call dataclasses.fields on a non-dataclass, quite a poor traceback is produced:
>>> import dataclasses
>>> dataclasses.fields(object)
Traceback (most recent call last):
File "C:\Users\alexw\AppData\Local\Programs\Python\Python311\Lib\dataclasses.py", line 1232, in fields
fields = getattr(class_or_instance, _FIELDS)
^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
AttributeError: type object 'object' has no attribute '__dataclass_fields__'
During handling of the above exception, another exception occurred:
Traceback (most recent call last):
File "<stdin>", line 1, in <module>
File "C:\Users\alexw\AppData\Local\Programs\Python\Python311\Lib\dataclasses.py", line 1234, in fields
raise TypeError('must be called with a dataclass type or instance')
TypeError: must be called with a dataclass type or instanceThere are two issues here:
- The traceback mentions the
__dataclass_fields__attribute, which is an internal implementation detail of thedataclassesmodule and should be hidden from the user. - The "during handling of the above exception, another exception occurred" message implies to the user that there's a bug in the
dataclassesmodule itself, rather than this being intentional behaviour.
This one-line change to dataclasses.py produces a much better traceback:
diff --git a/Lib/dataclasses.py b/Lib/dataclasses.py
index 82b08fc017..e3fd0b3e38 100644
--- a/Lib/dataclasses.py
+++ b/Lib/dataclasses.py
@@ -1248,7 +1248,7 @@ def fields(class_or_instance):
try:
fields = getattr(class_or_instance, _FIELDS)
except AttributeError:
- raise TypeError('must be called with a dataclass type or instance')
+ raise TypeError('must be called with a dataclass type or instance') from NoneWith this change applied, we get this traceback instead:
>>> import dataclasses
>>> dataclasses.fields(object)
Traceback (most recent call last):
File "<stdin>", line 1, in <module>
File "C:\Users\alexw\coding\cpython\Lib\dataclasses.py", line 1251, in fields
raise TypeError('must be called with a dataclass type or instance') from None
TypeError: must be called with a dataclass type or instanceCc. @ericvsmith and @carljm, as dataclasses experts.
Linked PRs
Reactions are currently unavailable
Metadata
Metadata
Assignees
Labels
3.10only security fixesonly security fixes3.11only security fixesonly security fixes3.12only security fixesonly security fixesstdlibStandard Library Python modules in the Lib/ directoryStandard Library Python modules in the Lib/ directorytype-bugAn unexpected behavior, bug, or errorAn unexpected behavior, bug, or error