我正试图理解Julia版本1.5中的@deprecate宏的工作方式。不幸的是,文档对我来说并不清楚:
“@deprecate old new [ex=true]”
使旧方法过期并指定替换调用的新方法。通过将ex设置为false,防止@deprecate导出old。@deprecate定义了一个与old具有相同签名的新方法。
警告: 从Julia 1.5开始,由@deprecate定义的函数在未设置--depwarn=yes标志的情况下运行julia时不会打印警告,因为--depwarn选项的默认值为no。警告是从Pkg.test()运行的测试中打印出来的。
示例: julia> @deprecate old(x) new(x) old (generic function with 1 method) julia> @deprecate old(x) new(x) false false old (generic function with 1 method)
那么我该怎么办?
这个
编辑:我注意到了我的错误。在这种情况下,签名(在我的情况下是
“@deprecate old new [ex=true]”
使旧方法过期并指定替换调用的新方法。通过将ex设置为false,防止@deprecate导出old。@deprecate定义了一个与old具有相同签名的新方法。
警告: 从Julia 1.5开始,由@deprecate定义的函数在未设置--depwarn=yes标志的情况下运行julia时不会打印警告,因为--depwarn选项的默认值为no。警告是从Pkg.test()运行的测试中打印出来的。
示例: julia> @deprecate old(x) new(x) old (generic function with 1 method) julia> @deprecate old(x) new(x) false false old (generic function with 1 method)
那么我该怎么办?
function old(x::Int)
print("Old behavior")
end
function new(x::Int)
print("New behavior")
end
# Adding true/false argument doesn't change my observations.
@deprecate old(x) new(x) # false
old(3)
# Prints "Old behaviour". No warning.
# Also: The deprecation is not mentioned in the help (julia>? old)
这个
@deprecate
宏的目的似乎是替换函数?我认为这很反直觉。如何标记一个函数已被弃用(即用户应该收到警告,并获得提示以使用替代方案,同时还应在文档中说明)?编辑:我注意到了我的错误。在这种情况下,签名(在我的情况下是
::Int
)必须完全相同才能起作用。但是,我如何获得警告?
@deprecate
背后的思想。我猜当每个人开始抱怨每个版本都重命名所有函数时,警告默认被禁用了。另一方面,我该如何实现我想要的功能?(不要替换该方法,甚至允许不指定替换,始终显示警告并包含在帮助文本中)。答案是这样的功能在标准库中不存在吗? - Adomas Baliuka--depwarn
,那么我想@deprecate
不是你想要的,而且我也不确定你能找到任何替代方案,它不会遵循这个特定命令行选项的含义。至于帮助文本,我想可以说@deprecate
可以接受docstrings,以便可以对弃用函数进行文档记录。如果您想要,您可以提交问题报告。或者使用@doc
手动记录已弃用的功能。 - François FévotteBase.depwarn
来引导用户使用替代方案。请参见https://github.com/JuliaImages/Images.jl/blob/de7d11fab7937efaa461874f2fa957dc0a31e602/src/deprecations.jl以获取一些示例。 - tholyforce
关键字参数,它可以确保用户即使没有要求也能看到警告信息。 - tholy