运行Julia 1.0.0时,@ printf宏似乎不能接受恒定格式字符串或可变格式字符串。如下所示。
julia> using Printf
julia> const fmt = "%10d %6.4f"
"%10d %6.4f"
julia> @printf(fmt, 101, 65.4039)
ERROR: LoadError: ArgumentError: @printf: first or second argument must be a format string
julia> fmt2 = "%10d %6.4f"
"%10d %6.4f"
julia> @printf(fmt2, 101, 65.4039)
ERROR: LoadError: ArgumentError: @printf: first or second argument must be a format string
我发现茱莉亚(2013)的早期版本中有discussion,其中不允许这种事情。
我在@printf
的1.0.0 documentation中看到以下语法:
@printf([io::IOStream], "%Fmt", args...)
这是否意味着调用时"@Fmt"
必须硬编码到@printf
参数中?
自2013年以来,对于Julia的@printf
,使用动态格式字符串有什么变化吗?
答案 0 :(得分:2)
据我检查@printf
的{{3}}所看到的,目前不支持。请注意,它会检查args[1] isa AbstractString
在您的示例中是否正确(其中typeof(args[1]) == Symbol
)。
如果您认为应该添加此内容,则可以提出功能请求implementation。
更新:
实际上,我应该已经阅读了您链接的github问题。尽管仍然不支持您所需的方式,但是有一些不错的方法可以处理这种情况。正如Stefan here所建议的那样,您可以执行以下操作:
julia> using Printf
julia> const fmt = "%10d %6.4f"
"%10d %6.4f"
julia> @eval myprintf(x,y) = @printf($fmt,x,y)
myprintf (generic function with 1 method)
julia> myprintf(101, 65.4039)
101 65.4039
这定义了一个(有效的)函数myprintf
,该函数内置了格式字符串。
答案 1 :(得分:0)
通过Julia Learner将答案从修改内容移至问题:
在版本1.0.0之前,@ printf的使用似乎没有更改。
对于其他想要动态格式字符串功能的人,这是我在Julia 1.0.0和9/20/2018版本的Formatting软件包中找到的内容。从其documentation
这个包裹是纯朱莉娅。设置此程序包就像设置其他Julia程序包:
Pkg.add(“格式化”)
使用1.0.0可能会出现错误错误:
julia> Pkg.add("Formatting")
ERROR: UndefVarError: Pkg not defined
*解决方案::使用[]键访问Julia 1.0.0中的新程序包管理器,请参见docs。
注意:以下命令区分大小写,add formatting
将失败。
(v1.0) pkg> add Formatting
现在,您对printfmt
的第一次测试可能会失败,如下所示:
julia> printfmt("Testing")
ERROR: UndefVarError: STDOUT not defined
解决方案::添加标准输出参数,并用小写字母拼写stdout
:
julia> printfmt(stdout, "Testing")
Testing
现在我们在Julia 1.0.0中具有有效的动态格式功能:
接下来,您可能会遇到以下错误:
julia> const fmt = "%10d %6.4"
ERROR: cannot assign variable Formatting.fmt from module Main
解决方案::使用与Formatting软件包不冲突的格式变量名称。在此示例中,还要注意使用Python样式的格式字符串:
julia> frmt = "{:10d} {:6.4f}" # Python-style format string
"{:10d} {:6.4f}"
julia> printfmt(stdout, frmt, 10, 65.4039)
10 65.4039