Skip to content

Commit

Permalink
pythongh-102947: Improve traceback when calling fields() on a non-d…
Browse files Browse the repository at this point in the history
…ataclass (pythonGH-102948)

(cherry picked from commit baf4eb0)

Co-authored-by: Alex Waygood <[email protected]>
  • Loading branch information
miss-islington and AlexWaygood authored Mar 23, 2023
1 parent f79cfb6 commit 6ffeeb2
Show file tree
Hide file tree
Showing 3 changed files with 15 additions and 1 deletion.
2 changes: 1 addition & 1 deletion Lib/dataclasses.py
Original file line number Diff line number Diff line change
Expand Up @@ -1234,7 +1234,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 None

# Exclude pseudo-fields. Note that fields is sorted by insertion
# order, so the order of the tuple is as the fields were defined.
Expand Down
12 changes: 12 additions & 0 deletions Lib/test/test_dataclasses.py
Original file line number Diff line number Diff line change
Expand Up @@ -5,11 +5,13 @@
from dataclasses import *

import abc
import io
import pickle
import inspect
import builtins
import types
import weakref
import traceback
import unittest
from unittest.mock import Mock
from typing import ClassVar, Any, List, Union, Tuple, Dict, Generic, TypeVar, Optional, Protocol
Expand Down Expand Up @@ -1500,6 +1502,16 @@ class C: pass
with self.assertRaisesRegex(TypeError, 'dataclass type or instance'):
fields(C())

def test_clean_traceback_from_fields_exception(self):
stdout = io.StringIO()
try:
fields(object)
except TypeError as exc:
traceback.print_exception(exc, file=stdout)
printed_traceback = stdout.getvalue()
self.assertNotIn("AttributeError", printed_traceback)
self.assertNotIn("__dataclass_fields__", printed_traceback)

def test_helper_asdict(self):
# Basic tests for asdict(), it should return a new dictionary.
@dataclass
Expand Down
Original file line number Diff line number Diff line change
@@ -0,0 +1,2 @@
Improve traceback when :func:`dataclasses.fields` is called on a
non-dataclass. Patch by Alex Waygood

0 comments on commit 6ffeeb2

Please sign in to comment.