创建通用函数处理多个变量的eval替代方法

1 投票
3 回答
1189 浏览
提问于 2025-04-18 14:18

我正在制作一系列游戏,有一段代码可以让问题只能被回答一次。如果玩家已经回答过这个问题,代码会给他们加分(这段代码放在一个检查答案的if函数里),然后就不允许再回答这个问题了。以下是我现在使用的代码:

while self.game1_question1_not_answered:
    self.game1_player1_score += self.score_increment
    self.game1_question1_not_answered = False`

我想在代码中使用'game1'作为一个通用的标识符,这样我就可以用它来识别我正在制作的多个游戏中的任何一个。我尝试使用一个叫做game_name的变量(比如,game_name = game1),然后用eval函数把这个变量放进代码里,但一直没有成功。此外,我也意识到eval函数有一些安全隐患。那么,有什么其他的函数可以让我实现这个功能呢?我尝试过的代码,但没有成功,长这样:

while eval('self.' + game_name + 'question1_not_answered'):
    eval('self.' + game_name + 'player1_score') += self.score_increment
    eval('self.' + game_name + 'question1_not_answered') = False

有没有其他的函数可以替代eval来实现这个功能呢?

3 个回答

0

通常,我们通过名字来访问对象的属性,可以使用 getattr(obj, name) 这个函数。不过,针对你提到的具体问题,我觉得用字典(或者字典的字典等等)来存储你的游戏状态(比如分数等)会更好。

2

你应该使用一个 dict(字典)来代替。这样你就可以创建一些动态命名的变量,用来存储信息。

self.game_dict = {}
self.game_dict[game_name + 'question1_not_answered'] = True

然后你可以像上面那样修改它,并用几种方式来访问它:

>>> game_obj.game_dict.get(game_name + 'question1_not_answered')
True
>>> game_obj.game_dict[game_name + 'question1_not_answered']
True

但是正如jonrsharpe所说,你的变量名不应该包含数据。最好的办法是创建多个游戏对象,每个对象都有像 question1_not_answered 这样的变量。如果需要的话,可以把这些对象都赋值给这个情况下的 self

1

我其实会遵循@jonrsharpe的建议,不过如果你真的需要把它们放在一个实例里,你可以使用内置的 getattrsetattr 函数:

     game_name = "game1"
     question1_na_line = "{}_question1_not_answered"
     player1_sc_line = "{}_player1_score"

     question1_na = question1_na_line.format(game_name)
     player1_sc = player1_sc_line.format(game_name)
     while getattr(self, question1_na):
         setattr(self,
                 player1_sc,
                 getattr(self, player1_sc) + self.score_increment)
         setattr(self, question1_na, False)

撰写回答