我读到应该避免使用 execeval 除非确实需要,所以我想知道以下情况是否是它的有效用法,如果不是,我可以用什么代替?

Npc 类的方法中,我需要从 Place 类的实例更改变量。像这样:

Npc.move(self,destination) 中:

exec "%s.matrix[self.position[0]][self.position[1]] = False" % (self.place)

其中 self.place 是 npc“所在”的 Place 实例的名称。执行时可能会给出,例如:
bedroom.matrix[0][0] = False

我能想到的是:在 Place 类上创建一个方法来做到这一点(将位置设置为 False )。但这样做真的更好吗?这样我最终会得到一些只使用一次的单行函数。

我还使用 exec 来调用外部方法:
def save(self):
    """
    Saves the object instance to the database.
    """
    exec "sql.routines.%s.add(self)" % (self.__type__)
__type__ 可以是 PlaceNpc 等等......我知道我可以使用一堆 if ,但是......这样做真的更好吗?我的意思是,我似乎看不到这里的“危险”。

最佳答案

不是在 Place 中存储 NPC 的字符串名称,而是存储 Place 类的一个实例,并直接调用该实例。

class Npc:
    def __init__(self, place):
        self.place = place

    def move(self, destination):
        self.place.matrix[self.position[0]][self.position[1]] = False
        ...

place = SomePlace()
npc = Npc(place)
npc.move("foo")
npc.place = SomeOtherPlace()
npc.move("bar")

第二个示例几乎可以肯定也可以重新设计以排除 exec 的使用,尽管如果没有 sql.routines 代码的详细信息就不可能说出来(我想它可能看起来像一个通用的 add 方法,而不是使用 instanceof 在必要时专门研究类型) .

除非您有令人信服的理由,否则我强烈建议您使用现有的 sql 库,例如 sqlalchemy

关于python - 关于exec的用法,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/17393572/

10-11 23:02