我读到应该避免使用 exec
和 eval
除非确实需要,所以我想知道以下情况是否是它的有效用法,如果不是,我可以用什么代替?
在 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__
可以是 Place
、 Npc
等等......我知道我可以使用一堆 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/