1. ホーム
  2. python

[解決済み] なぜ「eval」を使うのは悪い習慣なのか?

2022-04-25 14:27:33

質問

曲のデータを簡単に保存するために、以下のクラスを使っています。

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 は、バッドプラクティスであり、使用するのは安全でないと考えられているようです。もしそうなら、どなたかその理由を説明し、上記のクラスを定義する良い方法を教えていただけませんか?

どのように解決するのですか?

そうです。 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)

を使用しなければならない場合があります。 eval または exec . しかし、それらはまれなことです。使用する eval の場合、確かにバッドプラクティスです。私がバッドプラクティスを強調するのは evalexec は、間違った場所で頻繁に使用されます。

コメントへの返信

という意見もあるようです。 eval は、OPの場合、『非常に危険で不安』なのです。この特定のケースではそうかもしれませんが、一般的にはそうではありません。この質問は一般的なもので、私が挙げた理由は一般的なケースにも当てはまります。