Как расширить функцию, не меняя саму функциюPython

Программы на Python
Anonymous
Как расширить функцию, не меняя саму функцию

Сообщение Anonymous »

Мне интересно, смогу ли я расширить/дополнить функциональность базовой функции с помощью методов functools.
Я собираю модуль со множеством методов, возвращающих генераторы. , и я ищу эффективный способ их отправки (?), а также возможность возвращать список без изменения базового кода.
Например, у меня может быть простая функция который возвращает генератор. Я хотел бы расширить эту функцию, чтобы она также имела аргумент, который позволяет пользователю также возвращать список.
Следующее работает:
from typing import (
Union,
Generator,
List,
Literal,
)

from functools import wraps
from multimethod import multimethod

# already exists
def base_func(
a: int,
b: int,
) -> Generator:
assert b > a
for i in range(a, b):
yield i

#newly created
def extended_func(
a: int,
b: int,
return_as_list: bool,
) -> Union[Generator, List]:

gen = base_func(a, b)

return list(gen) if return_as_list else gen

Это кажется беспорядочным, или, по крайней мере, мне интересно, можно ли это сделать более эффективно с помощью диспетчеризации, поскольку я бы не хотел создавать совершенно новую функцию.
Я набросал приведенный ниже код, который не работает (он возвращает TypeError: тип 'bool' не является приемлемым базовым типом), но, возможно, я смогу понять, что я пытаюсь сделать делать. Я знаю, что на данный момент это может запутать первоначальную цель функции, но, думаю, я просто пытаюсь выяснить, возможно ли это вообще для моего собственного назидания.
## decorator
def as_list(func):
"""
convert generator to list
"""
@wraps(func)
def wrapper(*args, **kwargs):
return list(func(*args, **kwargs))
return wrapper

@multimethod
def test_func(
a: int,
b: int,
return_as_list: Literal[False],
) -> Generator[int, None, None]:
assert b > a
for i in range(a, b):
yield i

@test_func.register
@as_list
def _(
a: int,
b: int,
return_as_list: Literal[True],
):
...


Подробнее здесь: https://stackoverflow.com/questions/755 ... ion-itself

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