在Python 2.7中,我曾经能够使用以下代码(我正在使用emcee包):
def main():
from emcee import moves
emcee_moves = ['KDEMove(),0.5', 'DEMove(),0.5']
mv = [(eval("moves." + _)) for _ in emcee_moves]
if __name__ == '__main__':
main()
我使用它是因为我通过输入参数文件(这是更大代码的一小部分)输入“移动”,这意味着它们被读取为字符串。在Python 3.x中,现在抛出:
*** NameError: name 'moves' is not defined
这显然与这个老问题中提到的{a2}有关:{a3}
我还读到,通常不鼓励使用eval()
。那么,我的问题是:如何复制用于Python2.7的上述代码
编辑
这是实际失败的代码。它必须位于函数的内部,否则不会失败
尽管
I have Python 3.8.0 and the code works as expected - without any errors.
,正如我的评论所说,在没有任何eval()
的情况下仍然可以做到这些您希望动态地从模块中获取类。您可以使用
getattr()
进行此操作输出:
我不太清楚为什么会有这些
,0.5
后缀(__init__
参数,也许?),但“要点”写在上面您始终可以使用常规循环替换列表理解。不太花哨,但功能相同
正如Pete所说,您的示例适用于python 3.6.8。 但是,另一种方法是:
getattr通常比eval更安全
相关问题 更多 >
编程相关推荐