关键字参数 - 函数

时间:2018-06-06 14:53:23

标签: julia

我是 Julia 的初学者,

如何创建带参数关键字的函数,而不必在函数中初始化这些参数?

一个非常简单的例子

function f(;a = 1, b = 2)
 a+b
end

我想这样做:

function f(;a, b)
 a+b
end

最好的问候。

3 个答案:

答案 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

免责声明:我不推荐这个,我只是说根据您的功能考虑,这是另一种解决方法。