How to see parameters of a struct in Julia?

Viewed 438

In Python the command dir on an object returns the object's properties and methods. Is there an equivalent command in Julia? I know Julia does not have methods in the sense of Python's objects, but can we see the parameters of a struct?

3 Answers

If you are referring to the fields of a struct, then you can get a list of the field names using the fieldnames(T) function where T is of type DataType.

So say you want to know what fields some variable a has, you could do fieldnames(typeof(a)).

In addition to fieldnames and fieldtypes, from the other answer, the dump function can be used for introspection of both types and values, for example

julia> struct Foo{S, T<:AbstractVector{S}}
           x::T
           y::Int
       end

julia> dump(Foo)                                 # <-- dump on the type
UnionAll
  var: TypeVar
    name: Symbol S
    lb: Union{}
    ub: Any
  body: UnionAll
    var: TypeVar
      name: Symbol T
      lb: Union{}
      ub: AbstractArray{S, 1} <: Any
    body: Foo{S, T<:AbstractArray{S, 1}} <: Any
      x::T
      y::Int64

julia> dump(Foo([1, 2, 3], 1))                   # <-- dump on a value
Foo{Int64, Vector{Int64}}
  x: Array{Int64}((3,)) [1, 2, 3]
  y: Int64 1

@frederikekre's answer reminded me of the amazing package Eyeball.jl. It lets you interactively explore types and their instances, get docs for them, methods that operate on them (methodswith), etc. (Note however that it's at version 0.4.4, and there's still the occasional bug you might encounter.)

Here, after typing eye(fb), I pressed down arrow once to go to r: RegexMatch, and then m to get the list of methods that accept a RegexMatch.

julia> struct FooBar
         r::RegexMatch
         s::SubstitutionString
       end

julia> fb = FooBar(match(r"\d+", "test123"), s"42")
FooBar(RegexMatch("123"), s"42")

julia> eye(fb)
[f] fields [d] docs [e] expand [m/M] methodswith [o] open [r] tree [s] show [t] typeof [z] summarize [q] quit
     : FooBar  FooBar(RegexMatch("123"), s"42")
 >    r: RegexMatch  RegexMatch("123")
       match: SubString{String}  "123"
        string: String  "test123"
        offset: Int64  4
        ncodeunits: Int64  3
       captures: Vector{Union{Nothing, SubString{String}}} (0,) 0 Union{Nothing, SubString{String}}[]
       offset: Int64  5
       offsets: Vector{Int64} (0,) 0 Int64[]
       regex: Regex  r"\d+"
        pattern: String  "\\d+"
        compile_options: UInt32  0x040a0002
        match_options: UInt32  0x40000000
        regex: Ptr{Nothing}  Ptr{Nothing} @0x00000000024163f0
      s: SubstitutionString{String}  s"42"
       string: String  "42

Opening methodswith(`r`) ...

[f] fields [d] docs [e] expand [m/M] methodswith [o] open [r] tree [s] show [t] typeof [z] summarize [q] quit
 >   : Vector{Method} (12,) 96 Method[FooBar(r::RegexMatch, s::SubstitutionString) in Main at REPL[25]:2, eltype(m::RegexMatch) in Bas
      1: Method  FooBar(r::RegexMatch, s::SubstitutionString) in Main at REPL[25]:2
      2: Method  eltype(m::RegexMatch) in Base at regex.jl:262
      3: Method  getindex(m::RegexMatch, idx::Integer) in Base at regex.jl:245
      4: Method  getindex(m::RegexMatch, name::AbstractString) in Base at regex.jl:251
      5: Method  getindex(m::RegexMatch, name::Symbol) in Base at regex.jl:246
      6: Method  haskey(m::RegexMatch, idx::Integer) in Base at regex.jl:253
      7: Method  haskey(m::RegexMatch, name::AbstractString) in Base at regex.jl:258
      8: Method  haskey(m::RegexMatch, name::Symbol) in Base at regex.jl:254
      9: Method  iterate(m::RegexMatch, args...) in Base at regex.jl:260
      10: Method  keys(m::RegexMatch) in Base at regex.jl:219
      11: Method  length(m::RegexMatch) in Base at regex.jl:261
      12: Method  show(io::IO, m::RegexMatch) in Base at regex.jl:227

Related