opening a file using a relative path from a subclass in a package
Fredrik Lundh
fredrik at pythonware.com
Wed Dec 7 17:35:55 EST 2005
"spike grobstein" write:
> I understand why it wasn't working and it makes sense based on the
> structure of namespaces that python defines, however, I'm just
> surprised that there isn't some kind of built-in facility for dealing
> with these types of things.
>
> Module packages are a spectacular idea, it is just kinda easy to get
> confused when you start spaghettifying your imports with multiple
> directories and whatnot.
>
> My whole reason for wanting to do this is that I've written a program
> that contains a framework for extending the application. It's got a
> plugin-like module package framework that allows endusers to add new
> functionality, and I'd like it to not only be as trivial as possible to
> create new plugins (by simply plugging in values to a new subclass),
> but to also repeat as little code as possible (the DRY principal; don't
> repeat yourself)
>
> I toyed with the idea of using generic filenames (icon.png,
> description.rtf, etc), but ultimately decided against it when I thought
> about things I'd want to implement in the future.
why not just add an attribute to each subclass which tells the baseclass
where to look for the files ? if you let the attribute be either a directory
or a file in the directory, you can do
class MySubClass(somemodule.SuperClass):
location = __file__
...
in most subclasses, but you can also do fancier stuff, like:
class MyOtherSubClass(somemodule.SuperClass):
for p in ".", __file__, "/usr/local/mysystem/config/root":
if os.path.isfile(os.path.join(p, "config.xml")):
self.location = p # found it!
break
the superclass would then simply use self.location to locate stuff:
class SuperClass(...):
location = "."
def find_resources(self):
# location can be either a directory or a file in the
# config directory
location = self.location
if os.path.isfile(location): # use the directory this file is in
location = os.path.dirname(self.location)
data = ConfigLoader(os.path.join(location, "config.xml"))
...
</F>
More information about the Python-list
mailing list