Is it possible to define a module A and a submodule B without including B code in A directly or via an include() call? The goal is for “import A” not to load A.B and require users to explicitly “import A.B”.
Well, if you don’t export B
from the A
module you need to explicitly import A.B
to use the B
module:
julia> module A
module B
export foo
foo() = 42
end
end
A
julia> import A
julia> B.foo() # errors cause we have not imported A.B
ERROR: UndefVarError: B not defined
julia> import A.B
julia> B.foo()
42
This is not quite what I want. I want to have module B code in a separate file which would only be loaded when I do import A.B, but not when I do import A. This is how modules defined inside a package behave in Python.
See my latest post in https://github.com/JuliaLang/julia/issues/4600 for a plan to implement what I think you’re asking about.
@StefanKarpinski - your post seems to be about relative imports. What I am looking for is a much simpler scheme. I expected that import A.B
would first include("src/A.jl/A.jl")
. If doing that creates A.B
module, we are done. If not, look at src/A.jl/B.jl
. If that is a file - do include("src/A.jl/B.jl")
in the module A context. If it is a directory, do the same with src/A.jl/B.jl/B.jl
.
The proposal that I was referring to (“my latest post”) addresses exactly that. It works for relative or absolute imports as long they are for not-yet-defined submodules of some module that you are currently loading, which seems to be just what you’re asking about.