in elasticsearch/dsl/utils.py [0:0]
def _setattr(self, name: str, value: Any) -> None:
# if this attribute has special type assigned to it...
name = AttrDict.RESERVED.get(name, name)
if name in self._param_defs:
pinfo = self._param_defs[name]
if "type" in pinfo:
# get the shortcut used to construct this type (query.Q, aggs.A, etc)
shortcut = self.__class__.get_dsl_type(str(pinfo["type"]))
# list of dict(name -> DslBase)
if pinfo.get("multi") and pinfo.get("hash"):
if not isinstance(value, (tuple, list)):
value = (value,)
value = list(
{k: shortcut(v) for (k, v) in obj.items()} for obj in value
)
elif pinfo.get("multi"):
if not isinstance(value, (tuple, list)):
value = (value,)
value = list(map(shortcut, value))
# dict(name -> DslBase), make sure we pickup all the objs
elif pinfo.get("hash"):
value = {k: shortcut(v) for (k, v) in value.items()}
# single value object, just convert
else:
value = shortcut(value)
self._params[name] = value