Допустим, у меня есть функция, которая ожидает в качестве входных данных dict. В рамках этого эта функция может обрабатывать только значения этого dict, которые находятся в определенном Union
разрешенных типов. Для этого аргумента входные данные могут быть Number
, String
или Bool
:
allowed_types = Union{String, Int, AbstractFloat, Bool}
Функция также может разрешать Dicts, значения которых являются этими разрешенными типами (Dict{String,allowed_types}
), или массивы, чьи элементы являются этими типами (Array{allowed_types,Int}
), так как они могут быть "разобраны" до одного из этих разрешенных типов. (Это может продолжать идти вниз - так что массив массивов и т. Д. c)
full_allowed_types = Union{allowed_types, Dict{String,allowed_types}, Array{allowed_types,Int}}
Затем я могу определить свою функцию как
function my_func(input::Dict{String,full_allowed_types})
...
end
Как же тогда я структурирую аргументы моей функции, чтобы я мог передать, IE, 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
Я представляю эту проблему с точки зрения пользователя, где пользователь, скорее всего, просто создаст dict, используя конструктор по умолчанию, без учета того, что my_func
хочет "разрешить" (то есть я не ожидаю, что они вызовут Dict{String,my_pkg.full_allowed_types}(...)
).
Лучше всего просто разрешить Any
в качестве ввода для my_func
и затем выдает ошибку, если какой-либо из элементов не соответствует моим разрешенным типам, когда я перебираю ввод?