diff options
Diffstat (limited to 'lib/sqlalchemy/ext/hybrid.py')
| -rw-r--r-- | lib/sqlalchemy/ext/hybrid.py | 20 |
1 files changed, 13 insertions, 7 deletions
diff --git a/lib/sqlalchemy/ext/hybrid.py b/lib/sqlalchemy/ext/hybrid.py index be872804e..7200414a1 100644 --- a/lib/sqlalchemy/ext/hybrid.py +++ b/lib/sqlalchemy/ext/hybrid.py @@ -832,6 +832,8 @@ from ..util.typing import Protocol if TYPE_CHECKING: + from ..orm._typing import _ORMColumnExprArgument + from ..orm.interfaces import MapperProperty from ..orm.util import AliasedInsp from ..sql._typing import _ColumnExpressionArgument from ..sql._typing import _DMLColumnArgument @@ -840,7 +842,6 @@ if TYPE_CHECKING: from ..sql.operators import OperatorType from ..sql.roles import ColumnsClauseRole - _T = TypeVar("_T", bound=Any) _T_co = TypeVar("_T_co", bound=Any, covariant=True) _T_con = TypeVar("_T_con", bound=Any, contravariant=True) @@ -1289,7 +1290,7 @@ class Comparator(interfaces.PropComparator[_T]): ): self.expression = expression - def __clause_element__(self) -> ColumnsClauseRole: + def __clause_element__(self) -> _ORMColumnExprArgument[_T]: expr = self.expression if is_has_clause_element(expr): ret_expr = expr.__clause_element__() @@ -1298,10 +1299,15 @@ class Comparator(interfaces.PropComparator[_T]): assert isinstance(expr, ColumnElement) ret_expr = expr + if TYPE_CHECKING: + # see test_hybrid->test_expression_isnt_clause_element + # that exercises the usual place this is caught if not + # true + assert isinstance(ret_expr, ColumnElement) return ret_expr - @util.non_memoized_property - def property(self) -> Any: + @util.ro_non_memoized_property + def property(self) -> Optional[interfaces.MapperProperty[_T]]: return None def adapt_to_entity( @@ -1325,7 +1331,7 @@ class ExprComparator(Comparator[_T]): def __getattr__(self, key: str) -> Any: return getattr(self.expression, key) - @util.non_memoized_property + @util.ro_non_memoized_property def info(self) -> _InfoType: return self.hybrid.info @@ -1339,8 +1345,8 @@ class ExprComparator(Comparator[_T]): else: return [(self.expression, value)] - @util.non_memoized_property - def property(self) -> Any: + @util.ro_non_memoized_property + def property(self) -> Optional[MapperProperty[_T]]: return self.expression.property # type: ignore def operate( |
