Python3:使用列表理解将字符串转换为变量

2024-05-15 19:08:20 发布

您现在位置:Python中文网/ 问答频道 /正文

在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的上述代码


编辑

这是实际失败的代码。它必须位于函数的内部,否则不会失败


Tags: 代码nameinfromimportforifmain
3条回答

尽管I have Python 3.8.0 and the code works as expected - without any errors.,正如我的评论所说,在没有任何eval()的情况下仍然可以做到这些

您希望动态地从模块中获取类。您可以使用getattr()进行此操作

from emcee import moves
emcee_moves = ['KDEMove', 'DEMove']
mv = [getattr(moves, _)() for _ in emcee_moves]

输出:

In [22]: mv = [getattr(moves, _)() for _ in emcee_moves]

In [23]: mv
Out[23]:
[<emcee.moves.kde.KDEMove at 0x7f2bf8b98a90>,
 <emcee.moves.de.DEMove at 0x7f2bf90b08e0>]

我不太清楚为什么会有这些,0.5后缀__init__参数,也许?),但“要点”写在上面

您始终可以使用常规循环替换列表理解。不太花哨,但功能相同

正如Pete所说,您的示例适用于python 3.6.8。 但是,另一种方法是:

from emcee import moves
emcee_moves = [('KDEMove', 0.5), ('DEMove', 0.5)]
mv = [(getattr(moves, method)(), val) for method, val in emcee_moves]

getattr通常比eval更安全

相关问题 更多 >