diff options
| -rw-r--r-- | lib/sqlalchemy/ext/hybrid.py | 2 | ||||
| -rw-r--r-- | lib/sqlalchemy/orm/attributes.py | 16 |
2 files changed, 10 insertions, 8 deletions
diff --git a/lib/sqlalchemy/ext/hybrid.py b/lib/sqlalchemy/ext/hybrid.py index de9ab52be..a5dc31583 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 5e6852cbf..65d6970a9 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 = { |
