Imports, continued

I've been asked a follow up question about reexporting items.


I sent yesterday's post about imports to Danny Gratzer. He had a follow-up question:

“Is there a Python equivalent to the Haskell trick of doing the following which will then export all 3 modules?”

module Foo (module X) where
import Data.Text as X
import Data.ByteString as X
import Control.Lens as X

The following should accomplish the same result, though it isn't as concise due to Python's lack of an embedded module language. Though Haskell's module language is minimal[^1], it has one. In Python, file structure determines modules (and packages).

[^1]: ... relative to languages such as ML. There is ongoing work to improve Haskell's module language.

# foo/x.py:
from data.text import *
from data.byte_string import *
from control.lens import *

# foo/__init__.py:
import foo.x as x

# bar.py:
from foo import x

I wouldn't recommend these sorts of tricks as the import order affects what is in scope, e.g. if Data.Text and Data.ByteString both defined baz, which would be X.baz? Ideally import order should not matter as it is an implementation detail that should be hidden by a module. A language (or linter) can enforce that property by preventing imports with conflicting names in general.