From: Mike Bayer Date: Tue, 27 Dec 2022 22:20:07 +0000 (-0500) Subject: remove errant NO_KEY symbol X-Git-Tag: rel_2_0_0rc1~6^2 X-Git-Url: http://git.ipfire.org/cgi-bin/gitweb.cgi?a=commitdiff_plain;h=5cf6b6688ba9825fdba21478bc3c70fc7c4a78f5;p=thirdparty%2Fsqlalchemy%2Fsqlalchemy.git remove errant NO_KEY symbol the symbol from base is used in the event API and is passed along from attributes here. for the additional use where it's an exception case for attribute name as passed by hybrid, use a different symbol name. Change-Id: I8c5c0e71d19185ebec64f2fcbfe1e9be74e54287 --- diff --git a/lib/sqlalchemy/ext/hybrid.py b/lib/sqlalchemy/ext/hybrid.py index de9ab52be0..a5dc315839 100644 --- a/lib/sqlalchemy/ext/hybrid.py +++ b/lib/sqlalchemy/ext/hybrid.py @@ -1122,7 +1122,7 @@ class hybrid_property(interfaces.InspectionAttrInfo, ORMDescriptor[_T]): name = self.__name__ break else: - name = attributes.NO_KEY + name = attributes._UNKNOWN_ATTR_KEY # type: ignore[assignment] return proxy_attr( owner, diff --git a/lib/sqlalchemy/orm/attributes.py b/lib/sqlalchemy/orm/attributes.py index 5e6852cbf0..65d6970a97 100644 --- a/lib/sqlalchemy/orm/attributes.py +++ b/lib/sqlalchemy/orm/attributes.py @@ -55,6 +55,7 @@ from .base import Mapped as Mapped # noqa from .base import NEVER_SET # noqa from .base import NO_AUTOFLUSH from .base import NO_CHANGE # noqa +from .base import NO_KEY from .base import NO_RAISE from .base import NO_VALUE from .base import NON_PERSISTENT_OK # noqa @@ -115,20 +116,16 @@ if TYPE_CHECKING: _T = TypeVar("_T") -class NoKey(str): - pass - - _AllPendingType = Sequence[ Tuple[Optional["InstanceState[Any]"], Optional[object]] ] -NO_KEY = NoKey("no name") - SelfQueryableAttribute = TypeVar( "SelfQueryableAttribute", bound="QueryableAttribute[Any]" ) +_UNKNOWN_ATTR_KEY = object() + @inspection._self_inspects class QueryableAttribute( @@ -327,7 +324,12 @@ class QueryableAttribute( def _memoized_attr_expression(self) -> ColumnElement[_T]: annotations: _AnnotationDict - if self.key is NO_KEY: + # applies only to Proxy() as used by hybrid. + # currently is an exception to typing rather than feeding through + # non-string keys. + # ideally Proxy() would have a separate set of methods to deal + # with this case. + if self.key is _UNKNOWN_ATTR_KEY: # type: ignore[comparison-overlap] annotations = {"entity_namespace": self._entity_namespace} else: annotations = {