繁体   English   中英

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

[英]Python 3: strings to variable with list comprehension

在 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

这显然与这个旧问题中提到的这个不会修复错误有关: Eval scope in Python 2 vs. 3

我还读到,通常不鼓励使用eval() 那么我的问题是:如何复制上述用于 Python 2.7 的代码?


编辑

这是失败的实际代码。 它需要一个函数内,否则它不会失败。

正如皮特所说,您的示例适用于 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 更安全。

您始终可以用常规循环替换列表理解。 不那么花哨,但提供相同的功能。

虽然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__参数,也许?) ,但“要点”写在上面。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM