Issue7902
Created on 2010-02-10 19:09 by gangesmaster, last changed 2022-04-11 14:56 by admin. This issue is now closed.
| Files | ||||
|---|---|---|---|---|
| File name | Uploaded | Description | Edit | |
| bar.py | gangesmaster, 2010-02-10 19:09 | |||
| issue-7902.patch | meador.inge, 2010-02-24 05:27 | patch against 2.7 trunk | ||
| Messages (11) | |||
|---|---|---|---|
| msg99176 - (view) | Author: ganges master (gangesmaster) | Date: 2010-02-10 19:09 | |
the relative-import mechanism is broken... at least on python2.6 but i'd guess on later versions as well.
consider this package layout:
/tmp/foo/
/tmp/foo/__init__.py
/tmp/foo/bar.py
where bar.py is:
# note this is a relative import and should fail!
from .os import walk
print walk
# and this should also fail
from . import os
print os
running it yields a bug:
$ PYTHONPATH="/tmp" python
Python 2.6.4 (r264:75706, Dec 7 2009, 18:45:15)
[GCC 4.4.1] on linux2
Type "help", "copyright", "credits" or "license" for more information.
>>> import foo.bar
<function walk at 0xb7d2aa04> # <<<< ?!?!
Traceback (most recent call last):
File "<stdin>", line 1, in <module>
File "/tmp/foo/bar.py", line 4, in <module>
from . import os
ImportError: cannot import name os
"from . import os" fails as expected, but "from .os import walk" works -- although it should obviously fail too.
-tomer
|
|||
| msg99177 - (view) | Author: ganges master (gangesmaster) | Date: 2010-02-10 19:10 | |
i believe brett is in charge of this, adding him to the noisy. sorry if it's not you :) |
|||
| msg99179 - (view) | Author: Brett Cannon (brett.cannon) * ![]() |
Date: 2010-02-10 21:11 | |
So doing the import manually through __import__('os', globals(), locals(), ['walk'], 1) does not work. My guess is it has something to do with the IMPORT_FROM opcode (or something related), but I don't have time right now to dig deeper.
|
|||
| msg100006 - (view) | Author: Meador Inge (meador.inge) * ![]() |
Date: 2010-02-24 05:27 | |
> So doing the import manually through __import__('os', globals(),
> locals(), ['walk'], 1) does not work.
I get the same behavior for this reproduction case regardless of whether I use:
import .os import walk
or:
__import__('os', globals(), locals(), ['walk'], 1)
The bug is reproducible in the trunk.
I think the problem has to do with 'import_module_level' incorrectly doing an absolute lookup for 'os' when the relative lookup in 'foo' fails. I have attached a patch with the relevant fix and test case.
|
|||
| msg106065 - (view) | Author: Meador Inge (meador.inge) * ![]() |
Date: 2010-05-19 13:26 | |
Does this patch seem reasonable? |
|||
| msg106179 - (view) | Author: Brett Cannon (brett.cannon) * ![]() |
Date: 2010-05-20 18:41 | |
Thanks for the patch, Meador. All I did was tweak the test slightly. Committed in: + 2.7: r81380 + 2.6: r81381 |
|||
| msg113926 - (view) | Author: Martin v. Löwis (loewis) * ![]() |
Date: 2010-08-14 19:41 | |
Backporting this change to 2.6 has created an incompatibility in that branch, see for example issue9600. Apparently, it will only break code that is "conceptually wrong", but still "worked" on 2.6. I'll suggest that this is a release-critical issue for 2.6.6. It should be considered whether the incompatibility is accepted, or fixed, or reverted. |
|||
| msg114048 - (view) | Author: Florent Xicluna (flox) * ![]() |
Date: 2010-08-16 15:17 | |
Btw, the comment and failure message in r81380/r81381 look wrong. - # If absolute import syntax is used, then do not try to perform - # a relative import in the face of failure. + # If explicit relative import syntax is used, then do not try + # to perform an absolute import in the face of failure. self.fail("explicit relative import triggered " - "an implicit relative import") + "an implicit absolute import") In addition the TestCase.assertRaises method could be used: def test_absolute_import_without_future(self): # If explicit relative import syntax is used, then do not try # to perform a relative import in the face of failure. # Issue #7902. with self.assertRaises(ImportError): from .os import sep self.fail("explicit relative import triggered an " "implicit absolute import") |
|||
| msg114065 - (view) | Author: Florent Xicluna (flox) * ![]() |
Date: 2010-08-16 18:58 | |
Comment changed in r84097, 3.2 branch, with minor fixes. |
|||
| msg114067 - (view) | Author: Barry A. Warsaw (barry) * ![]() |
Date: 2010-08-16 19:11 | |
Guido has spoken: http://mail.python.org/pipermail/python-dev/2010-August/103104.html We'll keep the change for 2.6.6rc2. |
|||
| msg114082 - (view) | Author: Florent Xicluna (flox) * ![]() |
Date: 2010-08-16 22:44 | |
Merged in 3.1 with r84115. |
|||
| History | |||
|---|---|---|---|
| Date | User | Action | Args |
| 2022-04-11 14:56:57 | admin | set | github: 52150 |
| 2011-01-17 17:01:49 | r.david.murray | link | issue10926 superseder |
| 2010-08-16 22:44:22 | flox | set | messages: + msg114082 |
| 2010-08-16 19:11:12 | barry | set | status: open -> closed nosy: + barry messages: + msg114067 |
| 2010-08-16 18:58:33 | flox | set | messages: + msg114065 |
| 2010-08-16 15:17:55 | flox | set | nosy:
+ flox messages: + msg114048 |
| 2010-08-14 19:41:30 | loewis | set | status: closed -> open priority: normal -> release blocker |
| 2010-08-14 19:41:04 | loewis | set | nosy:
+ loewis messages: + msg113926 |
| 2010-05-20 18:41:46 | brett.cannon | set | status: open -> closed resolution: fixed messages: + msg106179 stage: patch review -> resolved |
| 2010-05-19 20:10:51 | brett.cannon | set | keywords:
+ needs review assignee: brett.cannon stage: patch review |
| 2010-05-19 13:26:03 | meador.inge | set | messages: + msg106065 |
| 2010-02-24 05:27:37 | meador.inge | set | files:
+ issue-7902.patch nosy:
+ meador.inge keywords: + patch |
| 2010-02-12 08:41:33 | Oren_Held | set | nosy:
+ Oren_Held |
| 2010-02-10 21:11:35 | brett.cannon | set | messages: + msg99179 |
| 2010-02-10 19:10:55 | gangesmaster | set | nosy:
+ brett.cannon messages: + msg99177 |
| 2010-02-10 19:09:21 | gangesmaster | create | |
