#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)
)