使用格式+;将对象传递给函数;exec(在Python中)
我正在用命令行输入编写一个两人RPG游戏。从理论上讲,写这样的东西很容易:使用格式+;将对象传递给函数;exec(在Python中),python,Python,我正在用命令行输入编写一个两人RPG游戏。从理论上讲,写这样的东西很容易: if input == "advance": self.rules.advance( p1, p2 ) elif input == "retreat": self.rules.retreat( p1, p2 ) 但是我尝试使用format()来生成一个更优雅、更通用的系统,但它并没有很好地工作。这是相关代码 def oneTurn(self, actor, target): print(acto
if input == "advance":
self.rules.advance( p1, p2 )
elif input == "retreat":
self.rules.retreat( p1, p2 )
但是我尝试使用format()
来生成一个更优雅、更通用的系统,但它并没有很好地工作。这是相关代码
def oneTurn(self, actor, target):
print(actor.name + "'s turn:")
self.valid = False
while self.valid == False:
self.choice = raw_input(":: ")
if self.choice.upper() in self.rules.verb_list:
cmd = "self.rules.{0}( {1}, {2} )"
cmd = cmd.format( self.choice.lower(), actor, target )
exec(cmd)
else:
print("Unknown command.")
因为游戏是两人的,所以所有的动作都必须是可逆的。这意味着它们接受参与者和目标(p1或p2)作为参数。因此,一轮完整的谈判将是:
oneTurn(p1, p2)
oneTurn(p2, p1)
但运行该程序会产生语法错误:
self.rules.advance( <__main__.soul instance at 0xblahblahblah>,<__main__.you get the idea> )
self.rules.advance(,)
小箭头指向第一个“要使用getattr,而不是易出错的exec:
if self.choice.upper() in self.rules.verb_list:
cmd = getattr(self.rules, self.choice.lower())
cmd(actor, target)
else:
print("Unknown command.")
显然,您还没有定义一个适合于从字符串中重新创建<代码>灵魂> /Cord>对象的代码>重写对象。我需要引用原件。这似乎是一个非常不明智的方法;丹尼尔的建议要好得多,或者您可以考虑一个明确的字典<代码> {CordPiNeNe:合适的方法}。。我刚刚测试了这个解决方案。它工作得非常好,非常感谢。(这是一种很棒的语言。)