Reputation: 38564
I'm building a web application with Twisted, and for the site resources I have a structure like this:
/resources
__init__.py
file.py
javascript.py
images.py
wsdl.py
/pages
__init__.py
page.py
static.py
login.py
...etc...
where file.py
and page.py
contain parent classes with common functionality (filepath validation and sessions/templates, respectively, for example). Each other script contains a single class which is a single twisted resource. my __init__.py
files look like this:
import javascript
Javascript = javascript.Javascript
import images
Images = images.Images
...
so that, in the main script, before handing execution over to twisted, I can just import resources; import pages
and then just reference resources.Javascript()
, pages.Login()
, etc, instead of having to write
from resources.javascript import Javascript
from resources.images import Images
from resources.wsdl import WSDL
from pages.static import Static
from pages.login import Login
...
and then use each of those classes to build the site structure. It gets unruly pretty quickly.
Note that I'm not approaching this with an "I am an always will be the sole developer on this project so it doesn't matter" mentality.
So is this an inhumane abuse of the import system? Should I just buckle and use from pages import *
and then use pages.Static()
, pages.Login()
, etc?
If this is appropriate for the site resources since each file contains a single class acting as that resource, would it be inappropriate to adopt elsewhere to avoid long strings of imports, or would it just lead to headaches?
Upvotes: 3
Views: 462
Reputation: 39837
Is there any reason you do not want to use (in resources/__init__.py
):
from javascript import Javascript
from images import Images
This would mean that in client code you can still do:
import resources
js = resources.Javascript()
imgs = resources.Images()
In either case, I do not think there is anything wrong in importing various definitions in __init__.py
to make them available directly through importing of the library/subpackage namespace. It is a common enough idiom, and I use it often.
Upvotes: 1
Reputation: 53859
I agree with Ignacio. I'd also point out that doing an import and then assignment like you do:
import javascript
Javascript = javascript.Javascript
...makes Javascript
available as both resources.javascript.Javascript
and resources.Javascript
. Is that intended? I always find that annoying when I'm introspecting a module.
Upvotes: 3
Reputation: 799150
That is considered acceptable usage since you maintain clean separation between resources, pages, etc. It's when you throw everything into one big pot that it all turns to slag.
But consider using absolute imports though (e.g. from resources.javascript import Javascript
) in __init__.py
so that you avoid future problems.
Upvotes: 2