summaryrefslogtreecommitdiff
path: root/lib/sqlalchemy/sql/traversals.py
diff options
context:
space:
mode:
Diffstat (limited to 'lib/sqlalchemy/sql/traversals.py')
-rw-r--r--lib/sqlalchemy/sql/traversals.py39
1 files changed, 13 insertions, 26 deletions
diff --git a/lib/sqlalchemy/sql/traversals.py b/lib/sqlalchemy/sql/traversals.py
index 983cd8ebd..4b55560ec 100644
--- a/lib/sqlalchemy/sql/traversals.py
+++ b/lib/sqlalchemy/sql/traversals.py
@@ -23,7 +23,6 @@ from typing import Optional
from typing import Set
from typing import Tuple
from typing import Type
-from typing import TypeVar
from . import operators
from .cache_key import HasCacheKey
@@ -34,6 +33,8 @@ from .visitors import HasTraversalDispatch
from .visitors import HasTraverseInternals
from .. import util
from ..util import langhelpers
+from ..util.typing import Self
+
SKIP_TRAVERSE = util.symbol("skip_traverse")
COMPARE_FAILED = False
@@ -68,9 +69,6 @@ def _preconfigure_traversals(target_hierarchy: Type[Any]) -> None:
)
-SelfHasShallowCopy = TypeVar("SelfHasShallowCopy", bound="HasShallowCopy")
-
-
class HasShallowCopy(HasTraverseInternals):
"""attribute-wide operations that are useful for classes that use
__slots__ and therefore can't operate on their attributes in a dictionary.
@@ -82,9 +80,7 @@ class HasShallowCopy(HasTraverseInternals):
if typing.TYPE_CHECKING:
- def _generated_shallow_copy_traversal(
- self: SelfHasShallowCopy, other: SelfHasShallowCopy
- ) -> None:
+ def _generated_shallow_copy_traversal(self, other: Self) -> None:
...
def _generated_shallow_from_dict_traversal(
@@ -97,10 +93,10 @@ class HasShallowCopy(HasTraverseInternals):
@classmethod
def _generate_shallow_copy(
- cls: Type[SelfHasShallowCopy],
+ cls,
internal_dispatch: _TraverseInternalsType,
method_name: str,
- ) -> Callable[[SelfHasShallowCopy, SelfHasShallowCopy], None]:
+ ) -> Callable[[Self, Self], None]:
code = "\n".join(
f" other.{attrname} = self.{attrname}"
for attrname, _ in internal_dispatch
@@ -110,10 +106,10 @@ class HasShallowCopy(HasTraverseInternals):
@classmethod
def _generate_shallow_to_dict(
- cls: Type[SelfHasShallowCopy],
+ cls,
internal_dispatch: _TraverseInternalsType,
method_name: str,
- ) -> Callable[[SelfHasShallowCopy], Dict[str, Any]]:
+ ) -> Callable[[Self], Dict[str, Any]]:
code = ",\n".join(
f" '{attrname}': self.{attrname}"
for attrname, _ in internal_dispatch
@@ -123,10 +119,10 @@ class HasShallowCopy(HasTraverseInternals):
@classmethod
def _generate_shallow_from_dict(
- cls: Type[SelfHasShallowCopy],
+ cls,
internal_dispatch: _TraverseInternalsType,
method_name: str,
- ) -> Callable[[SelfHasShallowCopy, Dict[str, Any]], None]:
+ ) -> Callable[[Self, Dict[str, Any]], None]:
code = "\n".join(
f" self.{attrname} = d['{attrname}']"
for attrname, _ in internal_dispatch
@@ -169,12 +165,10 @@ class HasShallowCopy(HasTraverseInternals):
cls._generated_shallow_to_dict_traversal = shallow_to_dict # type: ignore # noqa: E501
return shallow_to_dict(self)
- def _shallow_copy_to(
- self: SelfHasShallowCopy, other: SelfHasShallowCopy
- ) -> None:
+ def _shallow_copy_to(self, other: Self) -> None:
cls = self.__class__
- shallow_copy: Callable[[SelfHasShallowCopy, SelfHasShallowCopy], None]
+ shallow_copy: Callable[[Self, Self], None]
try:
shallow_copy = cls.__dict__["_generated_shallow_copy_traversal"]
except KeyError:
@@ -185,18 +179,13 @@ class HasShallowCopy(HasTraverseInternals):
cls._generated_shallow_copy_traversal = shallow_copy # type: ignore # noqa: E501
shallow_copy(self, other)
- def _clone(self: SelfHasShallowCopy, **kw: Any) -> SelfHasShallowCopy:
+ def _clone(self, **kw: Any) -> Self:
"""Create a shallow copy"""
c = self.__class__.__new__(self.__class__)
self._shallow_copy_to(c)
return c
-SelfGenerativeOnTraversal = TypeVar(
- "SelfGenerativeOnTraversal", bound="GenerativeOnTraversal"
-)
-
-
class GenerativeOnTraversal(HasShallowCopy):
"""Supplies Generative behavior but making use of traversals to shallow
copy.
@@ -210,9 +199,7 @@ class GenerativeOnTraversal(HasShallowCopy):
__slots__ = ()
- def _generate(
- self: SelfGenerativeOnTraversal,
- ) -> SelfGenerativeOnTraversal:
+ def _generate(self) -> Self:
cls = self.__class__
s = cls.__new__(cls)
self._shallow_copy_to(s)