Hi,

let say I have a legacy code with the following structure:

pkg1/__init__.py
pkg1/pkg2/__init__.py
pkg1/pkg2/bar.py
pkg1/pkg2/pkg3/__init__.py
pkg1/pkg2/pkg3/foo.py


In pkg1/pkg2/bar.py I have:

  # pkg1/pkg2/bar.py
  import pkg3.foo
  class Bar(pkg3.foo): pass

in pkg1/pkg2/pkg3/foo.py:

  # pkg1/pkg2/pkg3/foo.py
  class Foo: pass

Now I want to adapt bar.py such that it works in Python 3, but without 
modifying the definition of Bar class (I wan't restrict modification to import 
directives). My first thought was that I to just modify the import directive, 
such that the 'pkg3.foo' would be still available in bar.py. Unfortunately I 
can't find any way to do it. Obviously, this relative import is not going to 
work:

  from . import pkg3.foo

because it's a syntax error (pkg3.foo is not an identifier). This is accepted 
by python:

  from .pkg3 import foo

but it binds 'foo' instead of 'pkg3' to the local (bar) module, and I still 
have no access to 'pkg3.foo'.

The only way I found do have 'pkg3.foo' in 'bar' is this two-line trick:

  from . import pkg3
  from .pkg3 import foo

or

  from . import pkg3
  import pkg1.pk2.pk3.foo

but this clutters local (bar) namespace with symbols 'foo' (first case) or 
'pkg1' (second approach).

Do you know any other way for relative imports to achieve exactly same effect 
as with old import semantics?
-- 
https://mail.python.org/mailman/listinfo/python-list

Reply via email to