Python 这是使用exec/eval的正确位置吗?

Python 这是使用exec/eval的正确位置吗?,python,eval,Python,Eval,所以我一直听到每个人都说“不要使用exec,不要使用eval等等”,但我想知道在这种情况下使用它是否正确 我有多个功能,可以对不同的操作系统执行相同的操作: def doCoolStuff_Windows(): # do cool stuff here, windows edition def doCoolStuff_Darwin(): # do cool stuff here, mac edition 然后我有一个主功能,它可以检测用户的操作系统并为其运行正确的功能 我决定

所以我一直听到每个人都说“不要使用exec,不要使用eval等等”,但我想知道在这种情况下使用它是否正确

我有多个功能,可以对不同的操作系统执行相同的操作:

def doCoolStuff_Windows():
    # do cool stuff here, windows edition

def doCoolStuff_Darwin():
    # do cool stuff here, mac edition
然后我有一个主功能,它可以检测用户的操作系统并为其运行正确的功能

我决定不做“如果有别的话”的大动作,而是像这样使用exec更容易:

def doCoolStuff():
    system = platform.system()
    exec "doCoolStuff_%s()" % system
这是exec的正确用法吗?还是有更正确的方法来完成同样的任务


谢谢你,我不想发动一场火焰战,但是。。。不,在我看来,如果有一个非常简单的替代方案,而且很少有好的理由使用
eval
,那么使用
exec
就不是一个真正有效的方法

您可以像这样简单地设置一个dispatch dict,或者只使用if语句,这在这里更简单

 dispatch = {'Windows': doCoolStuff_Windows, 'Darwin': doCoolStuff_Darwin}
 def doCoolStuff():
     system = platform.system()
     if system in dispatch:
         dispatch[system]()

不是想发动一场火焰战,但是。。。不,在我看来,如果有一个非常简单的替代方案,而且很少有好的理由使用
eval
,那么使用
exec
就不是一个真正有效的方法

您可以像这样简单地设置一个dispatch dict,或者只使用if语句,这在这里更简单

 dispatch = {'Windows': doCoolStuff_Windows, 'Darwin': doCoolStuff_Darwin}
 def doCoolStuff():
     system = platform.system()
     if system in dispatch:
         dispatch[system]()


对于该示例,请使用if语句而不是exec简短地说:不,这不是
exec
的好用法。使用分支或映射。exec在这方面很好,这只是在处理未初始化的用户时的问题input@Natecat-不,
exec
不正常。这完全没有必要。当一本字典就足够了的时候,没有理由引入这样的东西。是的,它仍然是一本复制品。你有一个好主意。你没有受到不公平的处罚,因为你根本没有受到处罚。现在,这个问题将帮助其他人,他们想知道在这种情况下是否应该使用
exec
。)对于该示例,请使用if语句而不是exec简短地说:不,这不是
exec
的好用法。使用分支或映射。exec在这方面很好,这只是在处理未初始化的用户时的问题input@Natecat-不,
exec
不正常。这完全没有必要。当一本字典就足够了的时候,没有理由引入这样的东西。是的,它仍然是一本复制品。你有一个好主意。你没有受到不公平的处罚,因为你根本没有受到处罚。现在,这个问题将帮助其他人,他们想知道在这种情况下是否应该使用
exec
。)@不,我要说的是,字典的解决方案要优越得多。它甚至可以通过取消
if
和简单地执行
dispatch.get(system,lambda:None)(
@Natecat)来改进。我认为大多数人会更喜欢这个版本,如果没有其他原因,除了它100%明确说明列表中当前包含哪些操作系统。你需要知道的一切都在那里。对于exec版本,您必须去寻找它。请注意,通过将条目拆分为单独的行,可以使大型分派dict更具可读性。我以前从未听说过分派dict,而且它工作得非常好。我将把这个标记为答案。谢谢大家!在我的exec语句上按“dd”。哇,感觉很好。@Natecat-不,我要说的是字典解决方案要优越得多。它甚至可以通过取消
if
和简单地执行
dispatch.get(system,lambda:None)(
@Natecat)来改进。我认为大多数人会更喜欢这个版本,如果没有其他原因,除了它100%明确说明列表中当前包含哪些操作系统。你需要知道的一切都在那里。对于exec版本,您必须去寻找它。请注意,通过将条目拆分为单独的行,可以使大型分派dict更具可读性。我以前从未听说过分派dict,而且它工作得非常好。我将把这个标记为答案。谢谢大家!在我的exec语句上按“dd”。哇,感觉真好。