[解決済み] なぜ「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
は悪い習慣です。いくつか理由を挙げれば
- ほとんどの場合、より良い方法があります。
- 非常に危険で安全でない
- デバッグが困難
- 遅い
あなたの場合は 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
の場合、確かにバッドプラクティスです。私がバッドプラクティスを強調するのは
eval
と
exec
は、間違った場所で頻繁に使用されます。
コメントへの返信
という意見もあるようです。
eval
は、OPの場合、『非常に危険で不安』なのです。この特定のケースではそうかもしれませんが、一般的にはそうではありません。この質問は一般的なもので、私が挙げた理由は一般的なケースにも当てはまります。
関連
-
[解決済み] [Solved] sklearn error ValueError: 入力に NaN、infinity または dtype('float64') に対して大きすぎる値が含まれている。
-
[解決済み] 関数内でグローバル変数を使用する
-
[解決済み] 割り当て後にリストが予期せず変更されました。その理由と防止策を教えてください。
-
[解決済み] Python 3で「1000000000000000 in range(1000000000000001)」はなぜ速いのですか?
-
[解決済み] モジュールの関数名(文字列)を使って、モジュールの関数を呼び出す。
-
[解決済み] なぜC++はPythonよりもstdinからの行の読み込みが遅いのですか?
-
[解決済み] なぜlist.join(string)ではなくstring.join(list)なのでしょうか?
-
[解決済み] なぜJavaScriptのeval関数を使うとダメなのか?
-
[解決済み] eval、exec、compileの違いは何ですか?
-
[解決済み】forループを使った辞書の反復処理
最新
-
nginxです。[emerg] 0.0.0.0:80 への bind() に失敗しました (98: アドレスは既に使用中です)
-
htmlページでギリシャ文字を使うには
-
ピュアhtml+cssでの要素読み込み効果
-
純粋なhtml + cssで五輪を実現するサンプルコード
-
ナビゲーションバー・ドロップダウンメニューのHTML+CSSサンプルコード
-
タイピング効果を実現するピュアhtml+css
-
htmlの選択ボックスのプレースホルダー作成に関する質問
-
html css3 伸縮しない 画像表示効果
-
トップナビゲーションバーメニュー作成用HTML+CSS
-
html+css 実装 サイバーパンク風ボタン
おすすめ
-
PythonはWordの読み書きの変更操作を実装している
-
Python Pillow Image.save jpg画像圧縮問題
-
[解決済み】TypeError: unhashable type: 'numpy.ndarray'.
-
[解決済み】Pythonスクリプトで「Expected 2D array, got 1D array instead: 」というエラーが発生?
-
[解決済み】ImportError: PILという名前のモジュールがない
-
[解決済み】「SyntaxError.Syntax」は何ですか?Missing parentheses in call to 'print'」はPythonでどういう意味ですか?
-
[解決済み】Flask ImportError: Flask という名前のモジュールがない
-
[解決済み] リストをファイルに保存して、リスト型として読み込むには?
-
[解決済み] Pythonで16進文字列をintに変換する
-
[解決済み] 2進数の文字列をint型に変換する