Michael Michael - 3 months ago 7
Python Question

Conveniently import several classes from modules in a Python package

I'm currently creating a framework for a syntax tree. I have a folder/package

syntax
which contains one syntax tree element which is a class in each file, the structure looks then like:

syntax/List.py -> contains class List
syntax/Block.py -> contains class Block
syntax/Statement.py -> contains class Statement


Now I'd like to import the folder into my source file in a way that I can access the classes like

block = syntax.Block()


Is that possible at all? So far, I always ended up that I need
syntax.Block.Block()
which is not very nice...

Answer

Project structure

syntax
├── Block.py
├── __init__.py

The class

# syntax/Block.py (this file really ought to be lowercase, leave PascalCase to class names)
class Block(object):
    pass

Imports in __init__

# syntax/__init__.py
from .Block import Block   # Relative import with .

Using the package

In [5]: import syntax

In [6]: b = syntax.Block()

In [7]: b
Out[7]: <syntax.Block.Block at 0x108dcb990>

Alternative if you are open to some re-organization

Unlike languages that require us to put a single class into a file with same name (class Block inside file Block.py), Python is pretty flexible about this.

You can actually put many classes in syntax.py and import syntax alone, then access syntax.Block (no imports in __init__.py would be required for this)

# syntax.py
class Block(object):
    pass
class List(object):
    pass

Then can use as follows

import syntax
b = syntax.Block()
l = syntax.List()