问题是朱莉娅的'最佳实践'。我看过this和this。我有一个功能
function discount_rate(n, fv, pmt, pv; pmt_type = 0)
...
end
现在的问题是我必须像这样调用方法
discount_rate( 10, 10, 10, -10 )
目前尚不清楚这些论点的意思 - 即使我忘了。我想做的就是写
discount_rate( n = 10, fv = 10, pmt = 10, pv = -10 )
更清楚:更容易阅读和理解。但我无法通过创建这些参数keywords
参数或optional
参数来定义我的方法,因为它们没有自然默认值。从设计的角度来看,是否有推荐的解决方法?
答案 0 :(得分:6)
可以执行以下操作:
function discount_rate(;n=nothing,fv=nothing,pmt=nothing,pv=nothing,pmt_type=0)
if n == nothing || fv == nothing || pmt == nothing || pv == nothing
error("Must provide all arguments")
end
discount_rate(n,fv,pmt,pv,pmt_type=pmt_type)
end
function discount_rate(n, fv, pmt, pv; pmt_type = 0)
#...
end
答案 1 :(得分:0)
作为一个后续工作,必须(重新)编写关键字 - 我已经拥有的功能的对应物有点乏味。受到伊恩在上面的回答的启发,我写了一个基本上做同样事情的宏......
macro make_kwargs_only( func, args... )
quote
function $( esc( func ) )( ; args... )
func_args = [ arg[2] for arg in args ]
return $( esc( func ) )( func_args... )
end
end
end
所以,例如
f( a, b ) = a/b
@show f( 1, 2 )
f(1,2) => 0.5
创建仅限关键字的对应项
@make_kwargs_only f a b
@show f( a = 1, b = 2 )
f(a=1,b=2) => 0.5
但请注意,这不是一般情况。这里论证的顺序至关重要。理想情况下,我会喜欢宏以同样的方式为f( a = 1, b = 2 )
和f( b = 2, a = 1 )
工作。事实并非如此。
@show f( b = 2, a = 1 )
f(b=2,a=1) => 2.0
所以现在,作为一个黑客,如果我不能记住参数的顺序,我会使用methods( f )
。关于如何重写宏以处理这两种情况的任何建议都是受欢迎的...也许是一种基于func_args
的函数签名在宏的函数定义中对func
进行排序的方法?
答案 2 :(得分:0)
值得注意的是Julia在v0.7中引入了mandatory keyword arguments:
julia> foo(; a) = a
foo (generic function with 1 method)
julia> foo()
ERROR: UndefKeywordError: keyword argument a not assigned
Stacktrace:
[1] foo() at ./REPL[1]:1
[2] top-level scope at none:0
答案 3 :(得分:0)
这个答案在1.5中有什么不同吗?在Python中,每当我编写带有多个参数的函数时,通常都使用关键字参数来调用它。似乎没有一种干净的方法可以在Julia中做到这一点,而无需(1)为它们提供默认值(如Iain建议的可能是小数位数)或(2)使它们成为必需的关键字参数(如gTcV建议)