in odps/df/expr/expressions.py [0:0]
def _new_cls(cls, *args, **kwargs):
data_type = cls._get_type(*args, **kwargs)
if data_type:
base_class = cls._base_class(*args, **kwargs)
typed_classes = cls._typed_classes(*args, **kwargs)
data_type = types.validate_data_type(data_type)
name = data_type.CLASS_NAME + base_class.__name__
# get the typed class, e.g. Int64SequenceExpr, StringScalar
typed_cls = globals().get(name)
if typed_cls is None:
raise TypeError("Name {} doesn't exist".format(name))
if issubclass(cls, typed_cls):
return cls
elif cls == base_class:
return typed_cls
elif cls in typed_classes:
return typed_cls
keys = (cls, typed_cls)
if keys in _cached_typed_expr:
return _cached_typed_expr[keys]
mros = inspect.getmro(cls)
has_data_type = len([sub for sub in mros if sub in typed_classes]) > 0
if has_data_type:
mros = mros[1:]
subs = [sub for sub in mros if sub not in typed_classes]
subs.insert(1, typed_cls)
bases = []
for sub in subs[::-1]:
for i in range(len(bases)):
if bases[i] is None:
continue
if issubclass(sub, bases[i]):
bases[i] = None
bases.append(sub)
bases = tuple(base for base in bases if base is not None)
dic = dict()
if hasattr(cls, '_args'):
dic['_args'] = cls._args
dic['__slots__'] = cls.__slots__ + getattr(cls, '_slots', ())
dic['_add_args_slots'] = True
try:
accept_cls = next(c for c in bases if c.__name__ == cls.__name__)
if hasattr(accept_cls, 'accept'):
dic['accept'] = accept_cls.accept
except StopIteration:
pass
clz = type(cls.__name__, bases, dic)
_cached_typed_expr[keys] = clz
return clz
else:
return cls