#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.

-- 
You received this message because you are subscribed to the Google Groups 
"Django updates" group.
To unsubscribe from this group and stop receiving emails from it, send an email 
to [email protected].
To view this discussion visit 
https://groups.google.com/d/msgid/django-updates/0107019c9b2c63dc-c7fbe675-5188-4a08-b20c-f76769b95967-000000%40eu-central-1.amazonses.com.

Reply via email to