
This issue trackerhas been migrated toGitHub, and is currentlyread-only.
For more information, see the GitHub FAQs in the Python's Developer Guide.
Created on2017-03-19 00:09 byRichard Cooper, last changed2022-04-11 14:58 byadmin. This issue is nowclosed.
| Files | ||||
|---|---|---|---|---|
| File name | Uploaded | Description | Edit | |
| bug.py | Richard Cooper,2017-03-19 00:09 | Repo testcase | ||
| Pull Requests | |||
|---|---|---|---|
| URL | Status | Linked | Edit |
| PR 972 | merged | garvitdelhi,2017-04-03 11:19 | |
| Messages (5) | |||
|---|---|---|---|
| msg289834 -(view) | Author: Richard Cooper (Richard Cooper) | Date: 2017-03-19 00:09 | |
importlib.reload doesn't work; gives an error about NoneType having no name attribute.See attached a simple repo testcaseWhen run it yields the following [disappointing] result. I'm running Python3.0.6.1 (installed from brew) on OSX 10.12.3```iMac:python_package_loader cooper$ python3 bug.py module loadedTraceback (most recent call last): File "bug.py", line 14, in <module> importlib.reload(sys.modules[moduleName]) File "/usr/local/Cellar/python3/3.6.0_1/Frameworks/Python.framework/Versions/3.6/lib/python3.6/importlib/__init__.py", line 166, in reload _bootstrap._exec(spec, module) File "<frozen importlib._bootstrap>", line 589, in _execAttributeError: 'NoneType' object has no attribute 'name'``` | |||
| msg289903 -(view) | Author: Brett Cannon (brett.cannon)*![]() | Date: 2017-03-20 19:22 | |
First, I don't know what version you're testing against because 3.0.6.1 isn't an actual release of Python and 3.6.1 isn't released yet (unless you know something I don't know :) ).Second, the issue is that you're trying to import a module under a name which doesn't match the file specified. That's causing reload() to not be able to find the original source file to reload against, leading to the None being returned by importlib._bootstrap._find_spec() which is leading to the error you're seeing. (Remember, reload() basically runs like an import statement for the module you're reloading but recycles the module object.)Third, while an exception is reasonable in this case, it is misleading and reload() should be updated to raise an ImportError if _bootstrap._find_spec() returns None.I'm marking this issue as an easy fix since you just need to add an `is None` check on a return value and then raise ImportError if necessary in case someone wants to propose a PR to improve the error. It will require a doc update to document the change in the exception raised. | |||
| msg291081 -(view) | Author: Serhiy Storchaka (serhiy.storchaka)*![]() | Date: 2017-04-03 16:35 | |
Wouldn't ModuleNotFoundError be more appropriate? | |||
| msg291125 -(view) | Author: Brett Cannon (brett.cannon)*![]() | Date: 2017-04-04 16:33 | |
That's a good point, Serhiy, since that's what the exception is signaling. So yes, the exception should be ModuleNotFounderror. | |||
| msg294405 -(view) | Author: Brett Cannon (brett.cannon)*![]() | Date: 2017-05-24 22:19 | |
New changeset94987826e89e8a89c20f081e18be33fc840e6203 by Brett Cannon (Garvit Khatri) in branch 'master':bpo-29851: Have importlib.reload() raise ImportError if the module's spec is not found (GH-972)https://github.com/python/cpython/commit/94987826e89e8a89c20f081e18be33fc840e6203 | |||
| History | |||
|---|---|---|---|
| Date | User | Action | Args |
| 2022-04-11 14:58:44 | admin | set | github: 74037 |
| 2017-05-24 22:20:40 | brett.cannon | set | status: open -> closed resolution: fixed stage: resolved |
| 2017-05-24 22:19:52 | brett.cannon | set | messages: +msg294405 |
| 2017-04-04 16:33:10 | brett.cannon | set | messages: +msg291125 title: Have importlib.reload() raise ImportError when a spec can't be found -> Have importlib.reload() raise ModuleNotFoundError when a spec can't be found |
| 2017-04-03 16:35:51 | serhiy.storchaka | set | nosy: +serhiy.storchaka messages: +msg291081 |
| 2017-04-03 11:19:17 | garvitdelhi | set | pull_requests: +pull_request1149 |
| 2017-03-20 19:22:29 | brett.cannon | set | priority: normal -> low type: crash -> enhancement title: importlib.reload references None object -> Have importlib.reload() raise ImportError when a spec can't be found keywords: +easy nosy: +brett.cannon,ncoghlan,eric.snow versions: + Python 3.7 messages: +msg289903 |
| 2017-03-19 00:09:56 | Richard Cooper | create | |