我使用下面的类来轻松存储我的歌曲数据
课堂歌曲:
“”“存储每首歌曲详细信息的类”“”
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
是一种不好的做法。仅举几个原因:
- 几乎总是有更好的方法来做到这一点
- 非常危险和不安全
- 使调试变得困难
- 慢
在您的情况下,可以使用setattr:
课堂歌曲:
&引用&引用&引用;“存储每首歌曲详细信息的类”&引用&引用;
attsToStore=('Name'、'Artist'、'Album'、'Genre'、'Location')
定义初始化(自):
对于self.attsToStore中的att:
setattr(self,att.lower(),无)
def setDetail(自身、密钥、val):
如果输入self.attsToStore:
setattr(self,key.lower(),val)
在某些情况下,您必须使用eval
或exec
。但它们是罕见的。在您的情况下使用eval
肯定是一种不好的做法。我之所以强调糟糕的做法,是因为eval
和exec
经常在错误的地方使用
回复评论:
似乎有些人不同意在OP案例中,eval
是“非常危险和不安全的”。这可能适用于这种特殊情况,但不是一般情况。这个问题是一般性的,我列出的理由对于一般情况也是正确的