使用格式+;将对象传递给函数;exec(在Python中)

使用格式+;将对象传递给函数;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

我正在用命令行输入编写一个两人RPG游戏。从理论上讲,写这样的东西很容易:

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:合适的方法}。。我刚刚测试了这个解决方案。它工作得非常好,非常感谢。(这是一种很棒的语言。)