我是 Julia 的初学者,
如何创建带参数关键字的函数,而不必在函数中初始化这些参数?
一个非常简单的例子:
function f(;a = 1, b = 2)
a+b
end
我想这样做:
function f(;a, b)
a+b
end
最好的问候。
答案 0 :(得分:6)
这是0.7版本中的新功能 - 您实际上可以按照自己的意愿编写它。
Julia在0.6及更早版本上的语法要求你给它们一个默认值,但是由于在调用时评估了默认值,你实际上可以使用错误函数来要求它们:
julia> function f(;a=error("a not provided"), b=error("b not provided"))
a+b
end
f (generic function with 1 method)
julia> f()
ERROR: a not provided
Stacktrace:
[1] f() at ./REPL[1]:2
julia> f(a=2)
ERROR: b not provided
Stacktrace:
[1] (::#kw##f)(::Array{Any,1}, ::#f) at ./<missing>:0
julia> f(a=2, b=3)
5
答案 1 :(得分:4)
这是Julia 0.7行:
可能需要关键字参数:如果省略默认值,则如果调用者未为关键字指定值(#25830),则会引发异常。
所以:
function f(;a, b)
a+b
end
将成为语法糖:
function f(;a = throw(UndefKeywordError(:a)), b = throw(UndefKeywordError(:b)))
a+b
end
答案 2 :(得分:3)
另一种解决方法是使用可变参数关键字参数创建一个函数,并在期望的关键字输入上留下任何要求作为代码中的断言。 E.g。
function f( ; kwargs... )
V = Dict( kwargs )
try; assert( haskey( V, :a ) ); assert( haskey( V, :b ) )
catch e; throw( AssertionError("KWargs need to be a and b") )
end
V[:a] + V[:b]
end
f(a=1, b=2) #> 3
f(a=1, c=2) #> ERROR: AssertionError: KWargs need to be a and b
或者甚至如此简单:
function f( ; kwargs... )
V = Dict( kwargs )
a = V[:a]
b = V[:b]
a + b
end
f(a=1, c=2) #> ERROR: KeyError: key :b not found
免责声明:我不推荐这个,我只是说根据您的功能考虑,这是另一种解决方法。