1.1 --- a/micropython/common.py Tue Oct 08 22:59:10 2013 +0200
1.2 +++ b/micropython/common.py Tue Oct 08 23:59:47 2013 +0200
1.3 @@ -24,6 +24,7 @@
1.4 from micropython.basicdata import Const, Constant
1.5 from micropython.data import Attr, Class, Module
1.6 from micropython.errors import *
1.7 +from os.path import split
1.8
1.9 try:
1.10 set
1.11 @@ -247,19 +248,22 @@
1.12 if node.level == 0:
1.13 return node.modname, node.names
1.14
1.15 - # Relative to this module.
1.16 -
1.17 - elif node.level == 1:
1.18 - basename = module.full_name()
1.19 -
1.20 # Relative to an ancestor of this module.
1.21
1.22 else:
1.23 path = module.full_name().split(".")
1.24 - if node.level > len(path):
1.25 + level = node.level
1.26 +
1.27 + # Relative imports treat package roots as submodules.
1.28 +
1.29 + if split(module.filename)[-1] == "__init__.py":
1.30 + level -= 1
1.31 +
1.32 + if level > len(path):
1.33 raise InspectError("Relative import %r involves too many levels up from module %r" % (
1.34 - ("." * node.level + node.modname), module.full_name()))
1.35 - basename = ".".join(path[:-node.level+1])
1.36 + ("%s%s" % ("." * node.level, node.modname or "")), module.full_name()))
1.37 +
1.38 + basename = ".".join(path[:len(path)-level])
1.39
1.40 # Name imports from a module.
1.41
1.42 @@ -269,7 +273,7 @@
1.43 # Relative whole module imports.
1.44
1.45 else:
1.46 - return None, [("%s.%s" % (basename, name), alias) for name, alias in node.names]
1.47 + return None, [("%s.%s" % (basename, name), alias or name) for name, alias in node.names]
1.48
1.49 def used_by_unit(node):
1.50