Introspection

Introspection

isa / isinstance

@assert (1, 2, 3) isa Tuple
assert isinstance((1, 2, 3), tuple)

<: / issubtype

@assert Tuple <: Any
assert issubclass(tuple, object)

typeof / type

@assert typeof((1, 2, 3)) <: Tuple
assert type((1, 2, 3)) == tuple

Properties and fields

mutable struct ObjectWithProperties
    alpha
    beta
end

obj = ObjectWithProperties(1, 2)

@assert propertynames(obj) == (:alpha, :beta)
@assert fieldnames(ObjectWithProperties) == (:alpha, :beta)

@assert getproperty(obj, :alpha) == 1
@assert getfield(obj, :beta) == 2

setproperty!(obj, :alpha, 10); @assert obj.alpha == 10
setfield!(obj, :beta, 20); @assert obj.beta == 20
class ObjectWithProperties:
    alpha = 1
    beta = 2

obj = ObjectWithProperties()

assert set(dir(obj)) >= {"alpha", "beta"}
assert set(dir(ObjectWithProperties)) >= {"alpha", "beta"}

assert getattr(obj, "alpha") == 1

setattr(obj, "beta", 20); assert obj.beta == 20

Locals

f(a, b) = Base.@locals
@assert f(1, 2) == Dict(:a => 1, :b => 2)
def f(a, b):
    return locals()

assert f(1, 2) == dict(a=1, b=2)

Globals

m = Module(:SomeModule)
Base.eval(m, quote
    function f()
        names(@__MODULE__, all=true)
    end
end)
@assert Set(names(m, all=true)) >= Set([:SomeModule, :f])
@assert Set(m.f()) >= Set([:SomeModule, :f])
import types
m = types.ModuleType("SomeModule")
exec('''
def f():
    return list(globals())
''', vars(m))

assert set(vars(m)) >= {"__name__", "__doc__"}
assert set(m.f()) >= {"__name__", "__doc__"}