Эквивалент обратного вызова PHP

#python

Вопрос:

Я пытаюсь написать эквивалентный код python для этого PHP-кода :

 return $this->cache->get(
    sprintf('pokepedia.wikitext.pokemonmove.%s,%s.%s', $name, $generation, 'level'),
    function () use ($name, $generation) {
        return $this->moveClient->getPokemonMoves(
            $name,
            $generation,
            MoveSetHelper::LEVELING_UP_TYPE
        );
    }
);
 

Здесь функция кэша — это просто функция, принимающая строку в качестве первого параметра и вызываемую в качестве второго, тогда функция может выполнить мою вызываемую функцию, если данные отсутствуют в кэше.

У меня возникли проблемы с тем, как передать лямбда/закрытие с параметром (эквивалент использования() в PHP) функции в качестве параметра.

Ответ №1:

use особенностью PHP является явное закрытие внешних переменных, что в Python не требуется, поскольку внешние переменные уже доступны, как и во внутренних областях. Вам просто нужно что-то вроде:

 return self.cache.get(
    f'pokepedia.wikitext.pokemonmove.{name}.{generation}.level',
    lambda: self.moveClient.getPokemonMoves(name, generation, MoveSetHelper.LEVELING_UP_TYPE)
)
 

Если name и generation может измениться между вызовом cache.get и вызовом обратного вызова, то вы можете явно привязать эти текущие значения с помощью механизма значения по умолчанию аргумента:

 return self.cache.get(
    ...,
    lambda name=name, generation=generation: self...(name, generation, ...)
)
 

Или functools.partial :

 from functools import partial

return self.get.cache(
    ...,
    partial(self.moveClient.getPokemonMoves, name, generation, MoveSetHelper.LEVELING_UP_TYPE)
)