как запустить вложенные партиалы - PullRequest
0 голосов
/ 08 января 2019

У меня есть набор вложенных партиалов, которые я пытаюсь вызвать:

print(my_partial)

functools.partial(<function g at 0x000001A047370598>,
    functools.partial(<function f at 0x000001A047370620>, 
        functools.partial(<function c at 0x000001A047370400>, 5)))

поэтому, когда я пытаюсь запустить свою частичку, я возвращаю внутреннюю частичку:

print(my_partial)

functools.partial(<function f at 0x000001A047370620>, 
    functools.partial(<function c at 0x000001A047370400>, 5))

(или как-то так). В любом случае, чтобы запустить это, чтобы получить окончательное преобразование на 5 (входные данные), я должен сделать это:

print(my_partial()()()())

25

Есть ли функция functools, в которую я могу передать эти вложенные партиалы, чтобы она просто запустила все это для меня? Примерно так:

print(functools.run_partials(my_partial))

25

Существует ли что-то подобное? Надеюсь, что решение, над которым я работаю, глючит:

def run_nested(x):
    print(str(type(x())))
    if 'functools.partial' in str(type(x())):
        run_nested(x())
    print('DONE!', x())
    return x()

1 Ответ

0 голосов
/ 08 января 2019

Не думаю, что в functools есть что-то, что могло бы помочь. Вы всегда можете продолжать называть его, пока он больше не будет вызываться с одним while. Что-то вроде:

from functools import  partial

def f(fn):
    return fn

def g(fn):
    return fn

def c(n):
    return n*n

my_f = partial(g, partial(f, partial(c, 5) ))

print(my_f())
# functools.partial(<function f at 0x10eb7cd08>, functools.partial(<function c at 0x10eb7c598>, 5))

res = my_f
while(callable(res)):
    res = res()
print(res) # '25'
...