Python 将列表的字符串表示形式转换为实际的列表对象
我有一个看起来与列表相同的字符串,比如:Python 将列表的字符串表示形式转换为实际的列表对象,python,string,list,Python,String,List,我有一个看起来与列表相同的字符串,比如: fruits = "['apple', 'orange', 'banana']" 如何将其转换为列表对象?我认为这就是ast.literal\u eval的用途 () 正如评论中指出的那样,是安全的。从文档中: 安全地计算表达式节点或包含Python的字符串 表情。提供的字符串或节点只能由 以下Python文本结构:字符串、数字、元组、列表、, 口授、布尔语和无语 这可以用于安全地评估包含Python的字符串 来自不受信任源的表达式,无需解析 重视自己
fruits = "['apple', 'orange', 'banana']"
如何将其转换为列表对象?我认为这就是ast.literal\u eval的用途 () 正如评论中指出的那样,是安全的。从文档中: 安全地计算表达式节点或包含Python的字符串 表情。提供的字符串或节点只能由 以下Python文本结构:字符串、数字、元组、列表、, 口授、布尔语和无语 这可以用于安全地评估包含Python的字符串 来自不受信任源的表达式,无需解析 重视自己 对的简单调用将执行以下操作: 或者,正如本文所解释的,可以更安全地完成相同的操作(意思是:不存在意外副作用或恶意代码注入的风险),如下所示:
fruits = eval("['apple', 'orange', 'banana']", {'__builtins__':None}, {})
此解决方案的优点是不依赖于其他模块。注意:如果调用数组内部的函数(或除字符串、数字、元组、列表、dicts、boolean和None之外的任何类型),则此方法不起作用。对于这些情况,您可以使用
eval
。注意事项:ast.literal\u eval
仅适用于文字,其他情况均不适用。它确实可以保护您的程序不受代码注入的影响,例如,“['apple'、'orange'、'banana'];import os;os.remove('a_file')”
会因literal_eval而失败,我也有同样的问题,但我的字符串列表类似于此水果=“['apple'、'orange'、'banan'a']”
你将如何处理香蕉和a
之间的逗号。避免了我陷入字符串操作。使用eval(frtstring,{内置:无},{})可以更安全地实现这一点。
@mgilson谢谢你的提示,我更新了我的答案-1这里没有理由使用eval()
ast.literal\u eval()
将以一种更好、更安全的方式完成这项工作。虽然ast.literal\u eval
更好,但eval
起作用(它偶尔有用,因此值得了解)。我看不出有任何理由否决它,因为它确实符合问题的要求(+1)。@mgilson:使用eval()
会带来严重的安全隐患,即使{u内置:None}
也无法拯救您。
fruits = eval("['apple', 'orange', 'banana']")
fruits
> ['apple', 'orange', 'banana']
fruits = eval("['apple', 'orange', 'banana']", {'__builtins__':None}, {})