diff options
| author | Mike Bayer <mike_mp@zzzcomputing.com> | 2021-01-25 17:59:35 -0500 |
|---|---|---|
| committer | Mike Bayer <mike_mp@zzzcomputing.com> | 2021-01-25 17:59:35 -0500 |
| commit | 9205e9171cfd4b488be61228d8d53b0da1d49c19 (patch) | |
| tree | cbbbb25d1379ea141b2335ba29c326b2ea2bdcd5 /lib/sqlalchemy/util | |
| parent | 57db20a187e80950037dd5a2141a560fe879e054 (diff) | |
| download | sqlalchemy-9205e9171cfd4b488be61228d8d53b0da1d49c19.tar.gz | |
Fill-out dataclass-related attr resolution
Fixed issue where mixin attribute rules were not taking
effect correctly for attributes pulled from dataclasses
using the approach added in #5745.
Fixes: #5876
Change-Id: I45099a42de1d9611791e72250fe0edc69bed684c
Diffstat (limited to 'lib/sqlalchemy/util')
| -rw-r--r-- | lib/sqlalchemy/util/__init__.py | 1 | ||||
| -rw-r--r-- | lib/sqlalchemy/util/compat.py | 20 |
2 files changed, 21 insertions, 0 deletions
diff --git a/lib/sqlalchemy/util/__init__.py b/lib/sqlalchemy/util/__init__.py index 5f8788a6e..2d86b8b63 100644 --- a/lib/sqlalchemy/util/__init__.py +++ b/lib/sqlalchemy/util/__init__.py @@ -66,6 +66,7 @@ from .compat import int_types # noqa from .compat import iterbytes # noqa from .compat import itertools_filter # noqa from .compat import itertools_filterfalse # noqa +from .compat import local_dataclass_fields # noqa from .compat import namedtuple # noqa from .compat import next # noqa from .compat import nullcontext # noqa diff --git a/lib/sqlalchemy/util/compat.py b/lib/sqlalchemy/util/compat.py index 1eed2c3af..5b7a3eb9f 100644 --- a/lib/sqlalchemy/util/compat.py +++ b/lib/sqlalchemy/util/compat.py @@ -425,17 +425,37 @@ if py37: import dataclasses def dataclass_fields(cls): + """Return a sequence of all dataclasses.Field objects associated + with a class.""" + if dataclasses.is_dataclass(cls): return dataclasses.fields(cls) else: return [] + def local_dataclass_fields(cls): + """Return a sequence of all dataclasses.Field objects associated with + a class, excluding those that originate from a superclass.""" + + if dataclasses.is_dataclass(cls): + super_fields = set() + for sup in cls.__bases__: + super_fields.update(dataclass_fields(sup)) + return [ + f for f in dataclasses.fields(cls) if f not in super_fields + ] + else: + return [] + else: def dataclass_fields(cls): return [] + def local_dataclass_fields(cls): + return [] + def raise_from_cause(exception, exc_info=None): r"""legacy. use raise\_()""" |
