diff --git a/ibis/expr/datatypes/value.py b/ibis/expr/datatypes/value.py index 30ad6d26411e..809c5d4ad0ce 100644 --- a/ibis/expr/datatypes/value.py +++ b/ibis/expr/datatypes/value.py @@ -10,13 +10,14 @@ from collections.abc import Mapping, Sequence from functools import partial from operator import attrgetter -from typing import Any +from typing import Any, NoReturn import toolz from public import public import ibis.expr.datatypes as dt from ibis.common.collections import frozendict +from ibis.common.deferred import Deferred from ibis.common.dispatch import lazy_singledispatch from ibis.common.exceptions import IbisTypeError, InputTypeError from ibis.common.numeric import normalize_decimal @@ -37,6 +38,16 @@ def infer(value: Any) -> dt.DataType: ) +@infer.register(Deferred) +def infer_deferred(value: Deferred) -> NoReturn: + raise TypeError( + "Cannot infer the type of a Deferred value. " + "You will need to use a bound value instead. " + "For example, if you have `ibis._.my_col + 5`, " + "you will need to replace this with `my_table.my_col + 5`." + ) + + # TODO(kszucs): support NamedTuples and dataclasses instead of OrderedDict # which should trigger infer_map instead @infer.register(collections.OrderedDict)