Pythonで文字列を結合した動的コードをexec()とeval()で実行する

Kerasを使っていたとき、転移学習の元になるモデルを複数使いたいが、preprocess_inputという同じ関数名があって実行時に困っていた。

from keras.applications.vgg16 import preprocess_input, VGG16
from keras.applications.resnet50 import preprocess_input, ResNet50

そこで、元となるモデルを文字列で指定し、eval()とexec()によって動的にコードを生成することにした。

base_model = 'VGG16'
# base_model = 'ResNet50'

exec('from tensorflow.keras.applications.' + base_model.lower() + ' import ' + base_model + ', preprocess_input')
model = eval(base_model)(weights='imagenet', include_top=False)
x = preprocess_input(...)

eval()やexec()を使うと、文字列を結合してから動的にモジュールのインポートや関数の実行を行うことが出来るようになる。

メソッドの引数にしたり、リストにしてforループを回したり、色々活用出来そう。

参考

Programming Python
If you've mastered Python's fundamentals, you're ready to start using it to get real work done. Programming Python will show you how, with in-depth tutorials on...
組み込み関数 — Python 3.8.5 ドキュメント
組み込み関数 — Python 3.8.5 ドキュメント

コメント

タイトルとURLをコピーしました