argparseなソースコード
ディープラーニングとか勉強してるとき,githubに挙げられてるソースコードをとりあえず動かしてみる。こういうソースってコンソールから動かせるように引数をargparseで受ける構造になってることが多い。でもGPUなんて無いときはgoogle colaboratoryにお世話になりますよね。
こんなときcolabにソースをコピペしていくことになるけど,argparseな変数を書き換えないといけないのでちょっとだけ面倒くさい。そこで,argparseを一発で書き換えられるようにした。
変換コード
# argparse的な部分をコピーする
txt = """
parser = argparse.ArgumentParser()
parser.add_argument('--out', type=str, default='result',
help='Output directory')
parser.add_argument('--dataset-name', type=str, default='mscoco', choices=["mscoco", "stair_captions"],
help='MSCOCO dataset root directory')
parser.add_argument('--mscoco-root', type=str, default='data',
help='MSCOCO dataset root directory')
parser.add_argument('--max-iters', type=int, default=50000,
help='Maximum number of iterations to train')
args = parser.parse_args()
"""
print("class args():")
print(" "*4+"def __init__(self):")
for _ in range(20):
index = txt.find("add_argument")
if index < 0:
break
txt = txt[index:]
txt = txt[txt.find("--")+2:]
variable = txt[:txt.find("'")].replace("-","_")
txt = txt[txt.find("default"):]
txt = txt[txt.find("=")+1:]
val = txt[:txt.find(",")]
print(" "*8+"self."+variable+" = "+val)
print("args = args()")
これを動かすと,
class args():
def __init__(self):
self.out = 'result'
self.dataset_name = 'mscoco'
self.mscoco_root = 'data'
self.max_iters = 50000
args = args()
という文字列が出力されるので,argparse的な部分と置き換えれば他のとこを修正する必要なく動かせる。
他にもっといい方法があるのかな。