julia - 将 Julia 表达式转换为数组?

标签 julia

我正在获取一个保存为字符串的列表,并尝试解析它以供使用。我可以使用 Meta.parse 将字符串转换为表达式:

li = db.list
print(typeof(d[1]),d[1])
>> String
   ["apple", "banana", "coconut"]

parsed_li = Meta.parse(d[1])
print(typeof(parsed_li), parsed_li)
>> Expr
   ["apple", "banana", "coconut"]

但我似乎不能像普通列表一样使用它;例如,使用普通列表,我可以通过索引访问元素,但无法访问 Expr 对象的索引:

normal_li = ["apple", "banana", "coconut"]
print(normal_li[1])
>> apple

print(parsed_li[1])
>>
MethodError: no method matching getindex(::Expr, ::Int64)

Stacktrace:
 [1] top-level scope at In[214]:8

我一直在修补,不确定我在这里缺少什么!

最佳答案

依赖 Meta.parse() 解析您的输入数据既低效又不安全(恶意代码总是可以插入到输入数据中,您可能会执行 eval 等等)。您宁愿使用专门为此设计的工具。在您的情况下,请注意此数据可以被视为有效的 JSON 格式,并且可以按如下方式读取:


julia> str = """["apple", "banana", "coconut"]"""
"[\"apple\", \"banana\", \"coconut\"]"

julia> using JSON3

julia> JSON3.read(str)
3-element JSON3.Array{String, Base.CodeUnits{UInt8, String}, Vector{UInt64}}:
 "apple"
 "banana"
 "coconut"

julia> collect(JSON3.read(str))
3-element Vector{String}:
 "apple"
 "banana"
 "coconut"

如果您信任输入数据(通常您永远不应该),您可以采用不安全的方式进行操作:

julia> eval(Meta.parse(str))
3-element Vector{String}:
 "apple"
 "banana"
 "coconut"

如果您想在不使用 eval 的情况下提取信息,可以使用 Expr 对象的 args 字段来完成 - 但是它的方式每次的处理都强烈依赖于数据结构:

julia> Meta.parse(str).args
3-element Vector{Any}:
 "apple"
 "banana"
 "coconut"

关于julia - 将 Julia 表达式转换为数组?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/69693295/

相关文章:

arrays - 通过将数组 B 附加到数组 A 而不更改数组 A 的值,在 Julia 中定义数组(C)

julia - 固定包引入了 BinDeps : 的冲突要求

julia - Julia 中的变异函数(修改其参数的函数)

matrix - cg 的 View 实现!在矩阵上

python - Julia 中的 3D 网格数据插值

Julia 元编程 : Function for Mathematical Series

proxy - Julia 连接到代理后面的服务器

multithreading - 线性系统求解器在 Julia 中是否也像在 Matlab 中一样是多线程的?以及如何在 Julia 中对其进行 "multithread"处理?

julia - 如何将行添加到 .csv 文件

dataframe - 将组特定函数应用于 Julia 数据框