diff options
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\_()""" |
