Приведенный ниже код определяет общий класс Predicate, два конкретных подкласса и общий предикат отрицания.
Код: Выделить всё
class Predicate[T](Callable[[T], bool]):
"""
Base class for predicates: a function that takes a 'T' and evaluates to True or False.
"""
def __init__(self, _eval: Callable[[T], bool]):
self.eval = _eval
def __call__(self, *args, **kwargs) -> bool:
return self.eval(*args, **kwargs)
class StartsWith(Predicate[str]):
def __init__(self, prefix: str):
super().__init__(lambda s: s.startswith(prefix))
class GreaterThan(Predicate[float]):
def __init__(self, y: float):
super().__init__(lambda x: x > y)
class Not[T](Predicate[T]):
def __init__(self, p: Predicate[T]):
super().__init__(lambda x: not p(x))
if __name__ == '__main__':
assert StartsWith("F")("Foo")
assert GreaterThan(10)(42)
assert Not(StartsWith("A"))("Foo")
assert Not(GreaterThan(10))(3)
Код: Выделить всё
Traceback (most recent call last):
File "[...]/generics_demo.py", line 36, in
class StartsWith(Predicate[str]):
~~~~~~~~~^^^^^
File "", line 475, in __new__
TypeError: Callable must be used as Callable[[arg, ...], result].
Есть какие-нибудь подсказки, как это сделать?
Подробнее здесь: https://stackoverflow.com/questions/791 ... nheritance
Мобильная версия