创建通用函数处理多个变量的eval替代方法
我正在制作一系列游戏,有一段代码可以让问题只能被回答一次。如果玩家已经回答过这个问题,代码会给他们加分(这段代码放在一个检查答案的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的建议,不过如果你真的需要把它们放在一个实例里,你可以使用内置的 getattr
和 setattr
函数:
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)