小编典典

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

all

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

class Song:
    """The class to store the details of each song"""
    attsToStore=('Name', 'Artist', 'Album', 'Genre', 'Location')
    def __init__(self):
        for att in self.attsToStore:
            exec 'self.%s=None'%(att.lower()) in locals()
    def setDetail(self, key, val):
        if key in self.attsToStore:
            exec 'self.%s=val'%(key.lower()) in locals()

我觉得这比写出一个if/else块更具可扩展性。但是,我听说这eval是不安全的。是吗?有什么风险?如何在self不产生风险的情况下解决班级中的潜在问题(动态设置属性)?


阅读 83

收藏
2022-08-27

共1个答案

小编典典

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

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

在您的情况下,您可以改用setattr

class Song:
    """The class to store the details of each song"""
    attsToStore=('Name', 'Artist', 'Album', 'Genre', 'Location')
    def __init__(self):
        for att in self.attsToStore:
            setattr(self, att.lower(), None)
    def setDetail(self, key, val):
        if key in self.attsToStore:
            setattr(self, key.lower(), val)

在某些情况下,您必须使用evalor
exec。但它们很少见。在您的情况下使用eval肯定是一种不好的做法。我强调不好的做法,因为eval并且exec经常在错误的地方使用。

回复评论:

看起来有些人不同意eval在 OP
案例中“非常危险和不安全”。对于这种特定情况,这可能是正确的,但通常并非如此。这个问题很笼统,我列出的原因也适用于一般情况。

2022-08-27