我使用以下类来轻松存储我的歌曲数据。
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不产生风险的情况下解决班级中的潜在问题(动态设置属性)?
if/else
eval
self
是的,使用eval是一种不好的做法。仅举几个原因:
在您的情况下,您可以改用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经常在错误的地方使用。
exec
回复评论:
看起来有些人不同意eval在 OP 案例中“非常危险和不安全”。对于这种特定情况,这可能是正确的,但通常并非如此。这个问题很笼统,我列出的原因也适用于一般情况。