Написание декоратора Добавление Callables Принимая объекты общего типа в список экземпляровPython

Программы на Python
Ответить Пред. темаСлед. тема
Гость
 Написание декоратора Добавление Callables Принимая объекты общего типа в список экземпляров

Сообщение Гость »

Я хочу создать пользовательскую коллекцию (fncoll), которая является специфической для объекта T и содержит список Callables, каждый из которых принимает объект типа T и возвращает любое значение. < /p>

Код: Выделить всё

class FnColl[T]:
def __init__(self, fns: list[Callable[[T], Any]] = []) -> None:
self.fns: list[Callable[[T], Any]] = fns

def add(self, fn: Callable[[T], Any], invert: bool) -> Self:
if invert:
fn = self._invert(fn=fn)
self.fns.append(fn)
return self

@staticmethod
def _invert(fn: Callable[[T], Any]) -> Callable[[T], Any]: ...
< /code>
Предполагается, что этот класс дополнительно подкласс в более конкретных коллекциях функций (например, набор фильтров, которые будут использоваться в сборе объектов). < /p>
class Filters[T](FnColl[T]):
def __init__(self, fns: list[Callable[[T], bool]] = []):
super().__init__(fns=fns)

def add(self, fn: Callable[[T], bool], invert: bool) -> Self:
return super().add(fn=fn, invert=invert)
< /code>
У меня есть реализации конкретных объектов, как следующее. Каждая функция фильтра также должна получить дополнительный аргумент, если результат должен быть перевернут или нет, я не хочу явно определять для каждой функции фильтра. < /P>
class A
x: int
y: str

class AFilter(Filters[A]):
@add_filter
def has_value_for_x(self, obj: A) -> bool: ...

@add_filter
def has_specific_value_for_y(self, obj: A, specific_value: str) -> bool: ...
Подсказка: @add_filter Здесь только манекен, еще не определенный для демонстрации, который я хочу достичь механизма декоратора, чтобы создать набор фильтров, таких как следующие, без повторения кода.

Код: Выделить всё

f = AFilter().has_value_for_x(exclude=True).has_specific_value_for_y(specific_value="abc")
< /code>
Я хочу создать коллекции фильтров в цепей, причем каждая функция фильтра принимает аргумент exclude < /code> без явного определения и необязательно дополнительных аргументов в зависимости от функции.class Filters[T](FnColl[T]):
def __init__(self, fns: list[Callable[[T], bool]] = []):
super().__init__(fns=fns)

def add(self, fn: Callable[[T], bool], invert: bool) -> Self:
return super().add(fn=fn, invert=invert)

class Filter[**P, T1: Filters]:
type FilterFn = Callable[Concatenate[T1, T, P], bool]
type FilterApply = Callable[Concatenate[bool, P], T1]

def __init__(self, f: FilterFn) -> None:
self.fn = f

def __call__(
self, _self: T1, exclude: bool = False, *args: P.args, **kwds: P.kwargs
) -> T1:
def f(obj: T) -> bool:
return self.fn(_self, obj, *args, **kwds)

return _self.add(fn=f, invert=exclude)

def __get__(self, instance: T1, owner: type[T1]) -> FilterApply:
return partial(self.__call__, _self=instance)
При использовании его в Afilter Тип отчетов о проверке T @Фильтры не совместимы с для line @filters.filter
class AFilter(Filters[A]):
@Filters.Filter
def has_value_for_x(self, obj: A) -> bool: ...

@Filters.Filter
def has_specific_value_for_y(self, obj: A, specific_value: str) -> bool: ...
< /code>
Как я могу определить действительный подсказка типа /декоратор, чтобы избежать повторного кода для добавления функции фильтра в список экземпляров Callables?class AFilter(Filters[A]):
def has_value_for_x(self, exclude: bool = False) -> Self:
def f(a: A) -> bool:
return a.x is not None

return self.add(fn=f, invert=exclude)

def has_specific_value_for_y(self, specific_value: str, exclude: bool = False) -> Self:
def f(a: A) -> bool:
return a.y == specific_value

return self.add(fn=f, invert=exclude)
< /code>
Для нескольких коллекций фильтров для разных объектов со многими различными функциями фильтра, которые представляют собой много шаблонов. Под капотом это все еще является простым списком функций, но я хочу иметь стандартизированный и определенный интерфейс для коллекций фильтров и добавления фильтров.>

Подробнее здесь: https://stackoverflow.com/questions/794 ... nstance-li
Реклама
Ответить Пред. темаСлед. тема

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

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

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

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

  • Похожие темы
    Ответы
    Просмотры
    Последнее сообщение
  • Typling.union позволяет создавать Callables в качестве аргументов типа
    Anonymous » » в форуме Python
    0 Ответы
    5 Просмотры
    Последнее сообщение Anonymous
  • Когда использовать фабрику декоратора и декоратора?
    Anonymous » » в форуме Python
    0 Ответы
    3 Просмотры
    Последнее сообщение Anonymous
  • Когда использовать фабрику декоратора и декоратора?
    Anonymous » » в форуме Python
    0 Ответы
    3 Просмотры
    Последнее сообщение Anonymous
  • Как написать подсказку общего типа для метода Python для функции декоратора?
    Anonymous » » в форуме Python
    0 Ответы
    12 Просмотры
    Последнее сообщение Anonymous
  • Как ввести подсказку для метода, возвращающего список экземпляров общего класса данных?
    Anonymous » » в форуме Python
    0 Ответы
    12 Просмотры
    Последнее сообщение Anonymous

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