首页 > 解决方案 > 将函数/方法传递给 python 脚本

问题描述

我已经在 google colab 单元中定义了这个方法/函数

[5]:def lstm_model2(input_features, timesteps, regularizers=regularizers, batch_size=10):

       model = Sequential()
       model.add(LSTM(15, batch_input_shape=(batch_size, timesteps, 
          input_features), stateful=True,
                   recurrent_regularizer=regularizers))
       model.add(Dense(1))
       model.compile(loss='mae', optimizer='adam')

       return  model

我想将此方法传递给我正在使用 argparse 在下一个单元格中执行的脚本。

[6]:!python statefulv2.py --model=lstm_model2

我尝试了一种类似于argparse 中类型参数的方法,例如在脚本中定义一个同名的抽象方法,statefulv2.py以便argparse.add_argument('--model', help='LSTM model', type=lstm_model2, required=True)可以在其中编写statefulv2.py但是这会引发无效参数错误。

是否有一种巧妙的方法可以在 argparse 中将方法作为参数传递?

将方法保留在外部的原因是为了尝试不同的功能而对其进行编辑,因为 GoogleColab 没有提供单独的编辑器来在单独的文件中更改模型。

标签: pythonargparse

解决方案


最好不要尝试传递这样的参数。坚持基本类型。另一种方法是将不同的模型存储在类似的文件中models.py,例如:

def lstm_model1(...):
    # Definition of model1

def lstm_model2(...):
    # Definition of model2

等等。

statefulv2.py你可以有:

import models
import argparse

parser = ...
parser.add_argument('-m', "--model", help='LSTM model', 
                      type=str, choices=['model1', 'model2'], required=True)

model_dict = {'model1': models.lstm_model1(...),
              'model2': models.lstm_model2(...)}

args = parser.parse_args()

my_model = model_dict[args.model]

编辑:如果不允许将模型保存到文件。

如果您绝对必须找到解决方法,您可以将代码保存在缓冲区文件中,该文件可以statefulv2.py作为 type 的参数读入open。这是一个演示:

在 Colab 单元中,将函数代码写入字符串:

def save_code_to_file():
    func_string = """
def lstm_model3():
    print ("Hey!")
"""
    with open("buffer", "w") as f:
        f.write(func_string)

statefulv2.py中,您可以拥有:

import argparse

parser = argparse.ArgumentParser()

parser.add_argument('-m', "--model", help='LSTM model', type=open, required=True)

args = parser.parse_args()

lines = args.model.readlines()

model_def = ""
for line in lines:
    model_def += line

exec(model_def)

lstm_model3()

输出(这是在 iPython 中,为 Colab 相应地更改它):

In [25]: %run statefulv2.py -m buffer                                                  
Hey!

推荐阅读