【问题标题】:Combining eval() and return in a function在函数中结合 eval() 和 return
【发布时间】:2020-11-30 02:43:18
【问题描述】:

我正在尝试使用一个函数来迭代地返回几个机器学习模型(泡菜),其中一个函数基于我指定的准确度截止值。

我的问题是我正在尝试使用 eval 加载泡菜,因为它们的名称对应于 sdf['number'] 给出的数字。 eval 函数没有加载我的泡菜,除此之外,我希望它们由我的函数加载和返回。我已经通过尝试在加载每个模型之后直接通过每个模型运行数据来测试这一点,然后再移动到下一个模型,但它返回“learn0 not defined”例如。

关于如何更好地迭代地做到这一点有什么想法吗?

变量解释:

jar = 我使用的不同变量名称(学习者名称)的列表 预计它会加载。例如learn0、learn1等。

截止=准确截止

sdf_temp = 临时研究数据帧

def piklJar(sdf,cutoff):
    sdf_temp = sdf[sdf['value'] <= cutoff]
    
    jar = []
    i=0
    for pklNum in sdf_temp['number']:
        eval('"learn{} = load_learner({}/Models/Pkl {}.pkl)".format(i,datapath,pklNum)')
        jar.append('learn{}'.format(i))
        
        i+=1
        
    return jar

【问题讨论】:

  • 在这里使用eval 没有意义。除非你正在做一些严肃的元编程或实际上需要 python 解释器(例如编写 repl),否则你几乎不需要 eval,它几乎从来都不是一个好的解决方案
  • @juanpa.arrivillaga 有什么替代建议吗?
  • @En_g_neer 你的jar 变量在这里只是一个字符串列表,因为你附加的是一个字符串而不是变量。由于您要返回一个列表,因此分配唯一的变量名是没有用的
  • 正确,@MZ,我也打算返回字符串列表,所以我有一个列表供我正在加载的所有学习者参考。幸运的是,马克为我解决了这个问题。

标签: python python-3.x list-comprehension pickle fast-ai


【解决方案1】:

eval 不需要。您的示例代码无效,但这大致相同:

def piklJar(sdf,cutoff):
    sdf_temp = sdf[sdf['value'] <= cutoff]
    return [load_learner(f'{datapath}/Models/Pkl {pklNum}') for pklNum in sdf_temp['number']]

调用jar = pklJar(...) 后,jar[0] 将等效于learn0jar[1] 将等效于learn1,等等。各种load_learner 调用存储在从列表推导生成的列表中。

【讨论】:

  • 太棒了!谢谢马克。我相信这解决了我的问题。我刚刚分配了 x = piklJar(blabla,blabla) 它似乎已将我的模型作为列表存储在 x 中。
猜你喜欢
  • 2022-06-12
  • 1970-01-01
  • 2012-10-27
  • 2020-05-30
  • 1970-01-01
  • 2012-06-14
  • 2017-11-26
  • 2020-10-23
相关资源
最近更新 更多