次のクラスを使用して、曲のデータを簡単に保存します。
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
動的に設定する) を解決するにはどうすればよいでしょうか?
ベストアンサー1
はい、使用するのはeval
悪い習慣です。理由をいくつか挙げると、
- ほとんどの場合、より良い方法があります
- 非常に危険で不安定
- デバッグが困難になる
- 遅い
あなたの場合は、属性を設定するその代わり:
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)
eval
または を使用しなければならない場合もありますexec
が、それはまれです。あなたの場合、 を使用することは確かに悪い習慣です。と は間違った場所で頻繁に使用されるeval
ため、私は悪い習慣を強調しています。eval
exec
コメントへの返信:
OP のケースでは「非常に危険で安全ではない」ということに反対する人もいるようですeval
。この特定のケースではそうかもしれませんが、一般的にはそうではありません。質問は一般的なものであり、私が挙げた理由は一般的なケースにも当てはまります。