import in Python3.3
Steven D'Aprano
steve+comp.lang.python at pearwood.info
Tue Mar 26 19:06:02 EDT 2013
On Tue, 26 Mar 2013 08:37:00 -0700, rocky wrote:
> And again, I get the impression that for the use case asked about, there
> isn't much ambiguity. If I am in mypackage.foo and I want to access
> mypackage.collections I should be able to say something like that
> without ambiguity or that much inference or directory searching.
And you can: either explicitly say
import mypackage.collections
or use a relative import:
from . import collections
both of which only look inside mypackage.
> If
> mypackage.colletions is not found inside the same directory as
> mypackage.foo, often I DON'T WANT Python to helpfully go searching
> around other places for it which sys.path will do.
With both solutions above, Python will not.
> Instead what I
> probably want is Python to give me an error.
>
> So again I come to import_relative,
> http://code.google.com/p/pyimport-relative/. And again, I wish this
> package didn't have to exist.
I'm not convinced it does. I don't understand the problem you are trying
to solve. "Provide relative imports" is not that problem, because the use-
case you give on the project page does not describe relative imports, as
they are understood in Python terminology.
The error message you get gives the game away:
ValueError: Attempted relative import in non-package
In a stand-alone module, you can't do a relative import because there is
no package structure, hence there is nothing to import relative to.
As I don't quite understand your use-case, I'm a shooting in the dark
here, but it seems to me that you could fix this entire problem by simply
using a package instead of a directory of stand-alone modules. A mere
directory of stand-alone modules should be merely loosely coupled, no
different from any other modules in sys.path. If your modules are tightly
coupled, they should go in a package.
One thing which would make import manipulations much easier would be if
import (and __import__) took an explicit search path, as opposed to
operating on a system-wide global. E.g.
import module using this_path
would be nice.
--
Steven
More information about the Python-list
mailing list