Как передать вызываемый объект в качестве аргумента `functools.partial` - PullRequest
2 голосов
/ 13 февраля 2020

Этот код

import itertools
import functools

i = itertools.cycle(["1", "2"])

def f1():
    return next(i)

def f2(a):
    print(a)

f = functools.partial(f2, f1())

f()
f()

производит вывод 1 1. Есть ли очевидный способ предотвратить вычисление f1 при создании f, поэтому результат будет 1 2?

Ответы [ 2 ]

1 голос
/ 13 февраля 2020

Как насчет использования замыкания вместо functools?

import itertools

i = itertools.cycle(["1", "2"])

def f1():
    return next(i)

def f2(a):
    print(a)

def wrap(target, fun):
    def inner():
        target(fun())
    return inner

f = wrap(f2, f1)

f()  # 1
f()  # 2
0 голосов
/ 13 февраля 2020
import itertools
import functools

i = itertools.cycle(["1", "2"])

def f1(a):
    print(next(a))

f = functools.partial(f1, i)

f()
f()

Только что перенесенная работа над аргументом передана исправленной функции

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...