根据定义 Python 部分确定参数的解决方法?
Workaround for Python partial determining parameters upon definition?
我一直在开发基于卡牌的格斗游戏来练习 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)
partial 函数在第一次创建 Card 对象时尝试确定 player.health 的值,当时它不知道 'player' 是什么。我希望它在调用 attack(amount, player) 时确定 player.health 的值,这是 'player' 有意义的时候。我曾尝试使用 lambda 并将 attack() 函数放在 Card 对象中,但没有成功,而且我在 Internet 上找不到此类问题的任何答案。我需要一些方法来解决部分尝试在首次调用时确定 player.health,如果不是明确地通过重构我的代码逻辑的工作方式。
您可以使用 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))
我一直在开发基于卡牌的格斗游戏来练习 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)
partial 函数在第一次创建 Card 对象时尝试确定 player.health 的值,当时它不知道 'player' 是什么。我希望它在调用 attack(amount, player) 时确定 player.health 的值,这是 'player' 有意义的时候。我曾尝试使用 lambda 并将 attack() 函数放在 Card 对象中,但没有成功,而且我在 Internet 上找不到此类问题的任何答案。我需要一些方法来解决部分尝试在首次调用时确定 player.health,如果不是明确地通过重构我的代码逻辑的工作方式。
您可以使用 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))