gpt4 book ai didi

function - 如何在 Julia 中装饰一个函数?

转载 作者:行者123 更新时间:2023-12-03 16:47:18 25 4
gpt4 key购买 nike

当我在 Julia 中编写程序包时,我编写了几个类似的函数:

function scatterplot(data; x_col=:x, y_col=:y)

data |> @vlplot(:circle, x=x_col, y=y_col)
end
现在的问题是,我实际上想实现 kwargs在这个函数中,类似于:
function scatterplot(data; x_col=:x, y_col=:y; kwargs...)

data |> @vlplot(:circle, x=x_col, y=y_col;kwargs...)
end
但由于@vlplot 是一个宏,这实际上不起作用。所以我需要实际使用元编程如下:
function example(data;xcol,ycol,kwargs...)
x = kwargs
expression = "@vlplot(data=$data,mark=:point, x=$xcol, y=$ycol,"
for (k,v) in x
add = string(k,"=",v,",")
expression = expression*add
end
expression = expression[1:end-1]*")"
return expression
end
问题是,如果我想使用“kwargs”,我想避免为我的每个函数编写这个循环,因此,如何做到这一点?
我的想法是以某种方式“装饰”每个函数,例如 @decorate_with_kwargs scatterplot .这可能吗?

最佳答案

这是一种可能性:

function debugger(f, params...)
@show f, params
res = f(params...)
@show res
res
end
现在测试:
julia> f(x,y) = x+y;

julia> debugger(f, 2,3)
(f, params) = (f, (2, 3))
res = 5
5
如果您的目标是处理 kwargs在宏这里是如何:
function gn(x, args...;kwargs...)
println("I am called with x=$x args=$args kwargs=$kwargs")
end

macro fn(x, args...)
aargs = []
aakws = Pair{Symbol,Any}[]
for el in args
if Meta.isexpr(el, :(=))
push!(aakws, Pair(el.args...))
else
push!(aargs, el)
end
end
quote
gn($x, $aargs...; $aakws...)
end
end

关于function - 如何在 Julia 中装饰一个函数?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/64991326/

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