为什么使用“eval”是一种不好的做法?

我使用下面的类来轻松存储我的歌曲数据

课堂歌曲:
“”“存储每首歌曲详细信息的类”“”
attsToStore=('Name'、'Artist'、'Album'、'Genre'、'Location')
定义初始化(自):
对于self.attsToStore中的att:
exec'self.%s=None'%(att.lower())在locals()中
def setDetail(自身、密钥、val):
如果输入self.attsToStore:
exec'self.%s=val%%(key.lower())在局部变量()中

我觉得这比写一个if/else块更具扩展性。然而,eval似乎被认为是一种不良做法,使用起来不安全。如果是这样的话,有人能给我解释一下为什么,并给我展示一个更好的定义上述类的方法吗

是的,使用eval是一种不好的做法。仅举几个原因:

  1. 几乎总是有更好的方法来做到这一点
  2. 非常危险和不安全
  3. 使调试变得困难

在您的情况下,可以使用setattr:

课堂歌曲:
&引用&引用&引用;“存储每首歌曲详细信息的类”&引用&引用;
attsToStore=('Name'、'Artist'、'Album'、'Genre'、'Location')
定义初始化(自):
对于self.attsToStore中的att:
setattr(self,att.lower(),无)
def setDetail(自身、密钥、val):
如果输入self.attsToStore:
setattr(self,key.lower(),val)

在某些情况下,您必须使用evalexec。但它们是罕见的。在您的情况下使用eval肯定是一种不好的做法。我之所以强调糟糕的做法,是因为evalexec经常在错误的地方使用

回复评论:

似乎有些人不同意在OP案例中,eval是“非常危险和不安全的”。这可能适用于这种特殊情况,但不是一般情况。这个问题是一般性的,我列出的理由对于一般情况也是正确的

发表评论