How to check if variable is a typed global?

(other then try to assign a wrong-typed value and catch the error)

Let’s say you want to check myvar - you assume it is defined in Main and has type Int64.

myvar::Int64 = 1

function checkglobal()
    :myvar in names(Main) && # or hasproperty(Main, :myvar)
    Base.return_types(() -> getproperty(Main, :myvar))[1] == Int64


Another option (this only checks for global typed quality - without doing an explicit type test):

using Test
@inferred (() -> Main.:myvar)()

# or

@inferred (() -> getproperty(Main, :myvar))()

The above will fail if myvar is not a global typed defined in Main module.

Not sure how you want to treat the const scenario (you can have a typed global, which is also declared as const). However, you can add the following on the mix - depending on your end-goal:

# false - in the above snippet context
isconst(Main, :myvar)

@algunion thank you.

Do I understand it correctly that Base.return_types is not in the public API?

Also, I have tried to modify your function as to accept the variable name as argument - but it doesn’t work. Why?

myvar::Int64 = 1

function checkglobal(x)
    x in names(Main) && 
    Base.return_types(v -> getproperty(Main, v))[1] == Int64

# false - why?

I can see the return_types used in the manual here.

I don’t know why it doesn’t appear when searching the docs. The function is not used much in the Julia codebase but is well-represented (and useful) in the tests.

It seems to me that it is treated as being part of the public API, but somehow it doesn’t show (or is not properly exported in the docs). I’ll look into it.

As for your question related to why doesn’t work when you use the variable as an argument - I don’t have an answer right away, I’ll need to test/check that and come back with an answer later.

You don’t need the workaround via return_types here, there’s an internal function Core.get_binding_type(:: Module, ::Symbol) that should do what you want


@simeonschaub thank you, it works.

But shouldn’t be there some public API way to get this information, similar to isconst?

1 Like