Универсальные классы Python 3.13 с параметрами типа и наследованиемPython

Программы на Python
Ответить
Anonymous
 Универсальные классы Python 3.13 с параметрами типа и наследованием

Сообщение Anonymous »

Я изучаю типы в Python 3.13 и не могу получить общие подсказки по типизации настолько строгие, насколько хотелось бы.
Приведенный ниже код определяет общий класс 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].
При использовании класса StartsWith(Predicate): (т. е. любого предиката) это работает, но, на мой вкус, оно слишком свободно определено.
Есть какие-нибудь подсказки, как это сделать?

Подробнее здесь: https://stackoverflow.com/questions/791 ... nheritance
Ответить

Быстрый ответ

Изменение регистра текста: 
Смайлики
:) :( :oops: :roll: :wink: :muza: :clever: :sorry: :angel: :read: *x)
Ещё смайлики…
   
К этому ответу прикреплено по крайней мере одно вложение.

Если вы не хотите добавлять вложения, оставьте поля пустыми.

Максимально разрешённый размер вложения: 15 МБ.

Вернуться в «Python»