首页 > 解决方案 > 显示/println/etc 结构 julia jupyter

问题描述

我正在尝试为 Julia 结构创建一个专门的漂亮打印函数,该函数将以所需的方式输出到 Jupyter nb。如果我只是将其中一个结构作为 nb 帧的结果,那么我的专业节目显然有效,但如果我在代码中调用 show 则无效:

using Printf
struct foo
    bar
end
show(io::IO, ::MIME"text/plain", f::foo) = @printf(io, "A Foo with Bar=%s!!!",f.bar)
f1=foo(1234)
show(f1)                     # A
f1                           # B

输出(添加了 # 条评论):

foo(1234)                    # This comes from the inline show (A)
A Foo with Bar=1234!!!       # This is the result that's just blatted out from the eval (B)

我已经尝试了很多版本——导入和覆盖 Base.show,使用 print 和 println 而不是 show,以及导入/覆盖这些,等等。许多版本都像上面那样工作。有些以各种可预测的方式中断,但我尝试过的任何组合都不能让我通过我的专用 fn 输出到 nb 流中(即,我希望 #A 看起来像 #B)。我敢肯定这很简单,但我显然只是错过了一些东西

标签: structjuliapretty-print

解决方案


虽然@François Févotte 已经回答了这个问题,但请注意,值得使用该Parameters包来获得漂亮的struct打印效果。它可能适合您的需要或不适合您,但值得了解。

使用此短代码作为指导。

julia> using Parameters

julia> struct S1            
       x::Int               
       b::String            
       end                  
                            
julia> @with_kw struct S2   
       x::Int               
       b::String            
       end                  
S2                          
                            
julia> S1(5, "Hello")       
S1(5, "Hello")              
                            
julia> S2(5, "Hello")       
S2                          
  x: Int64 5                
  b: String "Hello"         
                            

推荐阅读