Украсить генератор параметрами

Chance struct to Class

до:

public struct MapTile
{
    public int bgAnimation;
    public int bgFrame;
}

после:

public Class MapTile
{
    public int bgAnimation;
    public int bgFrame;
}
0
задан Sanip 18 March 2019 в 17:19
поделиться

1 ответ

Используйте рецепт pairwise из itertools рецептов и сделайте его декоратором:

from itertools import tee

def pairwise(iterable):
    "s -> (s0,s1), (s1,s2), (s2, s3), ..."
    a, b = tee(iterable)
    next(b, None)
    return zip(a, b)
from functools import wraps

def pairwise_decorator(func):
    @wraps(func)
    def wrapper(*args, **kwargs):
        return pairwise(func(*args, **kwargs))
    return wrapper

Это прекрасно работает с генераторы (как и все функции в модуле itertools) и возвращает объект zip (особый вид генератора) в Python 3.

Пример использования:

@pairwise_decorator
def f(n):
    return range(n)

list(f(5))
# [(0, 1), (1, 2), (2, 3), (3, 4)]

Чтобы сделать это более общим (вызывать любую функцию на выходе декорированной функции), сделайте это декоратором, принимающим аргумент:

def call_after(outer_func):
    def decorator(func):
        @wraps(func)
        def wrapper(*args, **kwargs):
            return outer_func(func(*args, **kwargs))
        return wrapper
    return decorator

@call_after(pairwise)
def f(n):
    return range(n)

@call_after(lambda x: grouper(x, 3))
def g(n):
    return range(n)

list(f(5))
# [(0, 1), (1, 2), (2, 3), (3, 4)]
list(g(5))
# [(0, 1, 2), (3, 4, None)]
0
ответ дан Graipher 18 March 2019 в 17:19
поделиться
Другие вопросы по тегам:

Похожие вопросы: