Обходной путь для Python частичное определение параметров после определения? - PullRequest
0 голосов
/ 02 октября 2018

Я работаю над карточной боевой игрой, чтобы попрактиковаться в программировании на Python, и у меня есть объекты для игроков и карт.Я использовал functools.partial для присвоения способности каждому объекту карты при его создании, и до сих пор это работало так:

from functools import partial

class Player(object):
    def __init__(self):
        self.health = 100
    def play_card(self, card):
        card.ability(player=self)

human = Player()
computer = Player()
human.opponent = computer
computer.opponent = human

class Card(object):
    def __init__(self, ability):
        self.ability = ability

def attack(amount, player):
    player.opponent.health -= amount

working_card = Card(partial(attack, 8))
human.play_card(working_card)

Это, очевидно, значительно упрощенная версия кода,но это важная частьКогда я вызываю human.play_card (working_card), объект Player выполняет функцию play_card (card = working_card), которая затем активирует частичную функцию working_card.ability (), инициируя атаку (количество = 8, игрок = человек).

Но затем я ввожу переменную в качестве одного из параметров частичной функции следующим образом:

broken_card = Card(partial(attack, player.health))
human.play_card(broken_card)

Функция частичной попытки пытается определить значение player.health, когда объект Cardсначала создается, когда он не знает, что такое «игрок».Вместо этого я хочу определить значение player.health, когда вызывается атака (количество, игрок), то есть когда «player» имеет значение.Я попытался с помощью лямбды и размещения функции attack () внутри объекта Card безуспешно, и я не смог найти никаких ответов на этот вопрос в Интернете.Мне нужен какой-то способ обойти частичную попытку определить player.health при первом его вызове, если не явно, то путем перестройки способа работы логики моего кода.

1 Ответ

0 голосов
/ 02 октября 2018

Вы можете использовать lambda вместо partial для отсрочки оценки параметров:

broken_card = Card(lambda *args, **kwargs: attack(player.health, *args, **kwargs))

Имейте в виду, что player должен быть доступен в той же области, где это lambda определено.тем не мение.Поскольку player является вторым параметром attack, вы можете lambda использовать известный параметр:

broken_card = Card(lambda player: attack(player.health, player))
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...