Skip to content

raise AttributeError if loading fails in ctypes.LibraryLoader.__getattr__ #78997

@lfriedri

Description

@lfriedri
mannequin
Mannequin
BPO 34816
Nosy @eryksun, @lfriedri, @farfella
PRs
  • gh-78997: AttributeError if loading fails in LibraryLoader.__getattr__ #25177
  • Files
  • 34816.patch
  • Note: these values reflect the state of the issue at the time it was migrated and might not reflect the current state.

    Show more details

    GitHub fields:

    assignee = None
    closed_at = None
    created_at = <Date 2018-09-27.07:14:17.884>
    labels = ['easy', 'type-bug', '3.8', '3.9', '3.10', 'ctypes']
    title = 'raise AttributeError if loading fails in ctypes.LibraryLoader.__getattr__'
    updated_at = <Date 2021-04-04.02:29:42.566>
    user = 'https://github.com/lfriedri'

    bugs.python.org fields:

    activity = <Date 2021-04-04.02:29:42.566>
    actor = 'ateeq'
    assignee = 'none'
    closed = False
    closed_date = None
    closer = None
    components = ['ctypes']
    creation = <Date 2018-09-27.07:14:17.884>
    creator = 'lfriedri'
    dependencies = []
    files = ['49932']
    hgrepos = []
    issue_num = 34816
    keywords = ['patch', 'easy']
    message_count = 5.0
    messages = ['326528', '326556', '326557', '389629', '390168']
    nosy_count = 3.0
    nosy_names = ['eryksun', 'lfriedri', 'ateeq']
    pr_nums = ['25177']
    priority = 'normal'
    resolution = None
    stage = 'patch review'
    status = 'open'
    superseder = None
    type = 'behavior'
    url = 'https://bugs.python.org/issue34816'
    versions = ['Python 3.8', 'Python 3.9', 'Python 3.10']

    Linked PRs

    Activity

    lfriedri

    lfriedri commented on Sep 27, 2018

    @lfriedri
    MannequinAuthor

    The following creates an OSError:

    import ctypes
    hasattr(ctypes.windll, 'test')

    The expected behavior would be to return "False"

    eryksun

    eryksun commented on Sep 27, 2018

    @eryksun
    Contributor

    ctypes.windll is an instance of ctypes.LibraryLoader, which has a __getattr__ method that calls ctypes.WinDLL(name) and caches the result as an instance attribute. I suppose with chained exceptions it's reasonable to handle OSError in __getattr__ by raising AttributeError. For example:

        class A:
            def __init__(self, name):
                raise OSError
    
        class B:
            def __getattr__(self, name):
                try:
                    A(name)
                except OSError:
                    raise AttributeError

    Demo:

        >>> b = B()
        >>> b.test
        Traceback (most recent call last):
          File "<stdin>", line 4, in __getattr__
          File "<stdin>", line 3, in __init__
        OSError
    
        During handling of the above exception, another exception occurred:
    
        Traceback (most recent call last):
          File "<stdin>", line 1, in <module>
          File "<stdin>", line 6, in __getattr__
        AttributeError
    
        >>> hasattr(b, 'test')
        False

    FYI, I recommend avoiding the cdll and windll LibraryLoader instances. I wish they were deprecated because globally caching CDLL and WinDLL instances leads to conflicts between projects that use the same shared libraries.

    lfriedri

    lfriedri commented on Sep 27, 2018

    @lfriedri
    MannequinAuthor

    Thank you for your reply.

    I am not sure if I understood correctly:
    Do you suggest to modify ctypes.__init__.py so that the __getattr__ method of LibraryLoader catches the OSError and raises an AttributeError instead, as in your example?

    eryksun

    eryksun commented on Mar 28, 2021

    @eryksun
    Contributor

    __getattr__ method of LibraryLoader catches the OSError and
    raises an AttributeError

    Yes. It seems no one was keen to work on this. I think it's relatively easy, so I'll add that flag in case someone is looking for an easy issue.

    added
    3.9only security fixes
    3.10only security fixes
    and removed on Mar 28, 2021
    changed the title [-]ctypes + hasattr[/-] [+]raise AttributeError if loading fails in ctypes.LibraryLoader.__getattr__[/+] on Mar 28, 2021
    farfella

    farfella commented on Apr 4, 2021

    @farfella
    Mannequin

    First patch fixing only the issue at hand on master. LibraryLoader now catches OSError for FileNotFoundError and raises AttributeError.

    transferred this issue fromon Apr 10, 2022

    16 remaining items

    Loading
    Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

    Metadata

    Metadata

    Assignees

    No one assigned

      Labels

      3.10only security fixes3.8 (EOL)end of life3.9only security fixeseasytopic-ctypestype-bugAn unexpected behavior, bug, or error

      Projects

      No projects

      Milestone

      No milestone

      Relationships

      None yet

        Development

        No branches or pull requests

          Participants

          @eryksun@fzimmermann89@kevinhendricks@hauntsaninja

          Issue actions

            raise AttributeError if loading fails in ctypes.LibraryLoader.__getattr__ · Issue #78997 · python/cpython