@printf宏会使用预定义的格式字符串产生错误

时间:2018-09-20 04:38:34

标签: julia

运行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,使用动态格式字符串有什么变化吗?

2 个答案:

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