gpt4 book ai didi

polymorphism - 指定 Julia 函数只能采用内容属于特定类型的字典/数组的正确方法是什么?

转载 作者:行者123 更新时间:2023-12-04 04:09:56 24 4
gpt4 key购买 nike

假设我有一个需要字典作为输入的函数。其中,此函数只能处理某个字典中的值 Union允许的类型。对于此参数,输入可以是 Number , String , 或 Bool :

allowed_types = Union{String, Int, AbstractFloat, Bool}

该函数还可以允许值为这些允许类型(Dict{String,allowed_types})的字典或项目为这些类型(Array{allowed_types,Int})的数组,因为它们可以“分解”为其中一种允许类型。 (这可以继续向下 - 所以数组数组等)

full_allowed_types = Union{allowed_types, Dict{String,allowed_types}, Array{allowed_types,Int}}

然后我可以将我的函数定义为

function my_func(input::Dict{String,full_allowed_types})
...
end

那么,我如何构建我的函数参数,以便我可以传递 I.E,my_func(Dict("a"=>"astr","b"=>1)) ?通常是 Dict(...)调用结果为 Dict{String,Any} ,这不能用我的函数调用 Any不是允许的类型。

我当前实现的错误是:

my_func(Dict("a"=>"astr","b"=>1))
ERROR: MethodError: no method matching my_func(::Dict{String,Any})
Closest candidates are:
my_func(::Dict{String,Union{Bool, Int64, Dict{String,Union{Bool, Int64, AbstractFloat, String}}, AbstractFloat, Array{Union{Bool, Int64, AbstractFloat, String},Int64}, String}}) at <snip>/my_func.jl:41
Stacktrace:
[1] top-level scope at none:0

我从用户的角度来描绘这个问题,用户可能只是使用默认构造函数创建一个字典,而不考虑 my_func 是什么想要被“允许”(意思是我不希望他们调用 Dict{String,my_pkg.full_allowed_types}(...) )。

是只允许 Any 的最佳选择作为 my_func 的输入然后在我遍历输入时,如果任何元素不符合我允许的类型,则抛出错误?

最佳答案

function f(a::Dict{String, A}) where A <: Union{Int,String}
println("Got elem type $A")
end

用法:

julia> f(Dict{String,Union{String,Int}}("a"=>"astr","b"=>1))
Got elem type Union{Int64, String}

现在如果你想让用户方便,你可以添加一个额外的功能(但是,类型转换是有代价的):

function f(a::Dict{String,A}) where A
@warn "Provided unsupported type of elements $A will try narrow it to Union{Int,String}"
f(Dict{String,Union{Int,String}}(d))
end

示例用法:


julia> f(Dict("a"=>"astr","b"=>1))
┌ Warning: Provided unsuported type of elements Any will try narrow it to Union{Int,String}
└ @ Main REPL[31]:2
Got elem type Union{Int64, String}

关于polymorphism - 指定 Julia 函数只能采用内容属于特定类型的字典/数组的正确方法是什么?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/61469570/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com