In [21]: from juliacall import Main as jl
In [22]: jl.seval("using JuMP")
In [23]: JuMp = jl.seval("JuMP")
In [24]: JuMp.value # TAB completion works
Out[24]: value (generic function with 15 methods)
In [26]: jl.seval("struct B x end")
In [27]: B = jl.seval("B")
In [28]: b = B(2)
In [29]: b.x # TAB completion works in ipython
Out[29]: 2
In juliacall Julia modules are available in Python as instances of juliacall.ModuleValue. They are not really Python types or classes.
On the other hand, pyjulia (the julia module) makes Python modules out of Julia modules:
In [13]: from julia import JuMP
In [14]: JuMP.value
Out[14]: <PyCall.jlwrap value>
# JuliaModule is a subclass of the Python class (or type) ModuleType
In [15]: type(JuMP)
Out[15]: julia.core.JuliaModule
In [16]: from types import ModuleType
In [17]: isinstance(JuMP, ModuleType)
Out[17]: True
I don’t think it’s a necessarily a disadvantage. They both allow you to use dots, but in terms of the Python types, they are very different. I don’t know if one is better than the other or why.