#36956: import_string logic for AttributeError is too broad, can be improved under
Python 3.10+
-------------------------------------+-------------------------------------
Reporter: Glenn Matthews | Type:
| Cleanup/optimization
Status: new | Component: Utilities
Version: 6.0 | Severity: Normal
Keywords: import_string | Triage Stage:
| Unreviewed
Has patch: 0 | Needs documentation: 0
Needs tests: 0 | Patch needs improvement: 0
Easy pickings: 0 | UI/UX: 0
-------------------------------------+-------------------------------------
The logic in `import_string` that maps `AttributeError` to `ImportError`
is overly-broad and can be misleading, as ''any'' AttributeError raised
while importing the requested module will cause Django to report (perhaps
misleadingly) that the ''specific'' attribute being requested is not
defined:
{{{
try:
return cached_import(module_path, class_name)
except AttributeError as err:
raise ImportError(
'Module "%s" does not define a "%s" attribute/class'
% (module_path, class_name)
) from err
}}}
In Python 3.10 and later, `AttributeError` has been enhanced
(
https://docs.python.org/3/library/exceptions.html#AttributeError) to
include explicit `name` and `obj` parameters, making it easy to tell
exactly which specific attribute the error is attributed to.
My proposal is that the above logic should be enhanced to something like
the following:
{{{
try:
return cached_import(module_path, class_name)
except AttributeError as err:
if
err.name and
err.name != class_name:
raise
raise ImportError(
'Module "%s" does not define a "%s" attribute/class'
% (module_path, class_name)
) from err
}}}
If accepted, I'll be happy to open a PR as described.
--
Ticket URL: <
https://code.djangoproject.com/ticket/36956>
Django <
https://code.djangoproject.com/>
The Web framework for perfectionists with deadlines.