如何让Julia中的@info宏打印完整数组而非折叠形式?
在Julia中让@info完整打印数组的方法
使用@info宏记录日志时,数组会被折叠成列形式显示,完全不利于日志查看。以下是满足「不全局重写默认print/show函数、尽量不粗暴转字符串」要求的解决方案:
方法1:自定义紧凑显示的数组包装类型
这种方法仅对包装后的数组生效,不会修改全局的数组显示逻辑,同时保留数组的类型特性(不是字符串)。
先定义包装类型及对应的显示方法:
# 定义包装类型,继承原数组的接口 struct CompactArray{T,N,A<:AbstractArray{T,N}} <: AbstractArray{T,N} arr::A end # 继承数组的核心接口,保证包装后的数组能正常使用 Base.size(x::CompactArray) = size(x.arr) Base.getindex(x::CompactArray, i...) = getindex(x.arr, i...) Base.setindex!(x::CompactArray, v, i...) = setindex!(x.arr, v, i...) # 自定义show方法,让数组以单行紧凑形式完整显示 function Base.show(io::IO, x::CompactArray) show(IOContext(io, :compact => true, :limit => false), x.arr) end
之后在@info里用这个类型包装数组即可:
H = (; up_sharpness = 20.0, soft_abs_eps = 0.01, vh_a = 0.10352) R = [0.01229, 0.825731, 6.232608, -0.062631, 0.017161, 0.765596, 2.826992, 0.100005, 2.553098] Q = (; a = 0.01229, p = 0.825731, ν = 6.232608, λ = -0.062631) @info("found", H = H, R = CompactArray(round.(R, digits=6)), Q = round(Q, digits=6), )
运行后就能得到期望的输出:
┌ Info: found │ H = (up_sharpness = 20.0, soft_abs_eps = 0.01, vh_a = 0.10352) │ R = [0.01229, 0.825731, 6.232608, -0.062631, 0.017161, 0.765596, 2.826992, 0.100005, 2.553098] └ Q = (a = 0.01229, p = 0.825731, ν = 6.232608, λ = -0.062631)
方法2:用repr函数指定显示上下文
如果不想定义新类型,可以用repr函数通过上下文参数控制显示格式,这种方式不会全局修改默认行为,生成的是格式准确的字符串:
@info("found", H = H, R = repr(round.(R, digits=6), context=(:compact => true, :limit => false)), Q = round(Q, digits=6), )
这种方法比直接用string更灵活,能精准控制数组的显示样式,也符合要求。
内容的提问来源于stack exchange,提问作者Alex Craft
相关产品推荐
相关产品推荐

