raise AttributeError if loading fails in ctypes.LibraryLoader.__getattr__ #78997
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
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'
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']
The text was updated successfully, but these errors were encountered:
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
>>> 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.
Co-authored-by: Zachary Ware <email@example.com> Co-authored-by: Filipe Laíns <firstname.lastname@example.org> Co-authored-by: Eric Wieser <email@example.com>
* main: Improve stats presentation for calls. (pythonGH-100274) Better stats for `LOAD_ATTR` and `STORE_ATTR` (pythonGH-100295) pythongh-81057: Move the Cached Parser Dummy Name to _PyRuntimeState (python#100277) Document that zipfile's pwd parameter is a `bytes` object (python#100209) pythongh-99767: mark `PyTypeObject.tp_watched` as internal use only in table (python#100271) Fix typo in introduction.rst (python#100266) pythongh-78997: AttributeError if loading fails in LibraryLoader.__getattr__ pythonGH-100234: Set a default value for random.expovariate() (pythonGH-100235) Remove uninformative itertools recipe (pythonGH-100253) pythonGH-99767: update PyTypeObject docs for type watchers (pythonGH-99928) Move stats for the method cache into the `Py_STAT` machinery (pythonGH-100255) pythonGH-100222: fix typo _py_set_opocde -> _py_set_opcode (pythonGH-100259) pythonGH-100000: Cleanup and polish various watchers code (pythonGH-99998) pythongh-90111: Minor Cleanup for Runtime-Global Objects (pythongh-100254)
* Correct CVE-2020-10735 documentation (python#100306) * pythongh-94912: Added marker for non-standard coroutine function detection (python#99247) This introduces a new decorator `@inspect.markcoroutinefunction`, which, applied to a sync function, makes it appear async to `inspect.iscoroutinefunction()`. * Docs: Don't upload CI artifacts (python#100330) * pythongh-89727: Fix os.walk RecursionError on deep trees (python#99803) Use a stack to implement os.walk iteratively instead of recursively to avoid hitting recursion limits on deeply nested trees. * pythongh-69929: re docs: Add more specific definition of \w (python#92015) Co-authored-by: Jelle Zijlstra <firstname.lastname@example.org> * pythongh-89051: Add ssl.OP_LEGACY_SERVER_CONNECT (python#93927) Co-authored-by: blurb-it[bot] <43283697+blurb-it[bot]@users.noreply.github.com> Co-authored-by: Christian Heimes <email@example.com> Co-authored-by: Hugo van Kemenade <firstname.lastname@example.org> Fixes python#89051 * pythongh-88211: Change lower-case and upper-case to match recommendations in imaplib docs (python#99625) * pythongh-100348: Fix ref cycle in `asyncio._SelectorSocketTransport` with `_read_ready_cb` (python#100349) * pythongh-99925: Fix inconsistency in `json.dumps()` error messages (pythonGH-99926) * Clarify that every thread has its own default context in contextvars (python#99246) * pythongh-99576: Fix cookiejar file that was not truncated for some classes (pythonGH-99616) Co-authored-by: Łukasz Langa <email@example.com> * pythongh-100188: Reduce misses in BINARY_SUBSCR_(LIST/TUPLE)_INT (python#100189) Don't specialize if the index is negative. * pythongh-99991: improve docs on str.encode and bytes.decode (python#100198) Co-authored-by: C.A.M. Gerlach <CAM.Gerlach@Gerlach.CAM> * pythongh-91081: Add note on WeakKeyDictionary behavior when deleting a replaced entry (python#91499) Co-authored-by: Pieter Eendebak <P.T.firstname.lastname@example.org> Co-authored-by: Jelle Zijlstra <email@example.com> * pythongh-85267: Improvements to inspect.signature __text_signature__ handling (python#98796) This makes a couple related changes to inspect.signature's behaviour when parsing a signature from `__text_signature__`. First, `inspect.signature` is documented as only raising ValueError or TypeError. However, in some cases, we could raise RuntimeError. This PR changes that, thereby fixing python#83685. (Note that the new ValueErrors in RewriteSymbolics are caught and then reraised with a message) Second, `inspect.signature` could randomly drop parameters that it didn't understand (corresponding to `return None` in the `p` function). This is the core issue in python#85267. I think this is very surprising behaviour and it seems better to fail outright. Third, adding this new failure broke a couple tests. To fix them (and to e.g. allow `inspect.signature(select.epoll.register)` as in python#85267), I add constant folding of a couple binary operations to RewriteSymbolics. (There's some discussion of making signature expression evaluation arbitrary powerful in python#68155. I think that's out of scope. The additional constant folding here is pretty straightforward, useful, and not much of a slippery slope) Fourth, while python#85267 is incorrect about the cause of the issue, it turns out if you had consecutive newlines in __text_signature__, you'd get `tokenize.TokenError`. Finally, the `if name is invalid:` code path was dead, since `parse_name` never returned `invalid`. * pythonGH-100363: Speed up `asyncio.get_running_loop` (python#100364) * pythonGH-100133: fix `asyncio` subprocess losing `stderr` and `stdout` output (python#100154) * pythongh-100374: Fixed a bug in socket.getfqdn() (pythongh-100375) * pythongh-100129: Add tests for pickling all builtin types and functions (pythonGH-100142) * Remove unused variable from `dis._find_imports` (python#100396) * pythongh-78878: Fix crash when creating an instance of `_ctypes.CField` (python#14837) * pythonGH-69564: Clarify use of octal format of mode argument in help(os.chmod) (python#20621) Co-authored-by: Kumar Aditya <firstname.lastname@example.org> * pythonGH-99554: Pack location tables more effectively (pythonGH-99556) * Correct typo in typing.py (python#100423) In the docstring of `ParamSpec`, the name of `P = ParamSpec('P')` was mistakenly written as `'T'`. * pythongh-99761: Add `_PyLong_IsPositiveSingleDigit` function to check for single digit integers (python#100064) * pythonGH-99770: Make the correct call specialization fail kind show up in the stats (pythonGH-99771) * pythongh-78997: fix bad rebase of moved test file (python#100424) * pythongh-100344: Add C implementation for `asyncio.current_task` (python#100345) Co-authored-by: pranavtbhat * pythonGH-99554: Trim trailing whitespace (pythonGH-100435) Automerge-Triggered-By: GH:brandtbucher * pythongh-85432: Harmonise parameter names between C and pure-Python implementations of `datetime.time.strftime`, `datetime.datetime.fromtimestamp` (python#99993) * pythongh-57762: fix misleading tkinter.Tk docstring (python#98837) Mentioned as a desired change by terryjreedy on the corresponding issue, since Tk is not a subclass of Toplevel. * pythongh-48496: Added example and link to faq for UnboundLocalError in reference (python#93068) * Fix typo in 3.12 What's New (python#100449) * pythongh-76963: PEP3118 itemsize of an empty ctypes array should not be 0 (pythonGH-5576) The itemsize returned in a memoryview of a ctypes array is now computed from the item type, instead of dividing the total size by the length and assuming that the length is not zero. * pythonGH-100459: fix copy-paste errors in specialization stats (pythonGH-100460) * pythongh-99110: Initialize `frame->previous` in init_frame to fix segmentation fault when accessing `frame.f_back` (python#100182) * pythongh-98712: Clarify "readonly bytes-like object" semantics in C arg-parsing docs (python#98710) * pythongh-92216: improve performance of `hasattr` for type objects (pythonGH-99979) * pythongh-100288: Specialise LOAD_ATTR_METHOD for managed dictionaries (pythonGH-100289) * Revert "pythongh-100288: Specialise LOAD_ATTR_METHOD for managed dictionaries (pythonGH-100289)" (python#100468) This reverts commit c3c7848. * pythongh-94155: Reduce hash collisions for code objects (python#100183) * Uses a better hashing algorithm to get better dispersion and remove commutativity. * Incorporates `co_firstlineno`, `Py_SIZE(co)`, and bytecode instructions. * This is now the entire set of criteria used in `code_richcompare`, except for `_PyCode_ConstantKey` (which would incorporate the types of `co_consts` rather than just their values). * pythongh-83076: 3.8x speed improvement in (Async)Mock instantiation (python#100252) * pythongh-99482: remove `jython` compatibility parts from stdlib and tests (python#99484) * bpo-40447: accept all path-like objects in compileall.compile_file (python#19883) Signed-off-by: Filipe Laíns <email@example.com> Signed-off-by: Filipe Laíns <firstname.lastname@example.org> Co-authored-by: Irit Katriel <email@example.com> Co-authored-by: Shantanu <firstname.lastname@example.org> * pythonGH-100425: Improve accuracy of builtin sum() for float inputs (pythonGH-100426) * pythongh-68320, pythongh-88302 - Allow for private `pathlib.Path` subclassing (pythonGH-31691) Users may wish to define subclasses of `pathlib.Path` to add or modify existing methods. Before this change, attempting to instantiate a subclass raised an exception like: AttributeError: type object 'PPath' has no attribute '_flavour' Previously the `_flavour` attribute was assigned as follows: PurePath._flavour = xxx not set!! xxx PurePosixPath._flavour = _PosixFlavour() PureWindowsPath._flavour = _WindowsFlavour() This change replaces it with a `_pathmod` attribute, set as follows: PurePath._pathmod = os.path PurePosixPath._pathmod = posixpath PureWindowsPath._pathmod = ntpath Functionality from `_PosixFlavour` and `_WindowsFlavour` is moved into `PurePath` as underscored-prefixed classmethods. Flavours are removed. Co-authored-by: Alex Waygood <Alex.Waygood@Gmail.com> Co-authored-by: Brett Cannon <email@example.com> Co-authored-by: Adam Turner <9087854+AA-Turner@users.noreply.github.com> Co-authored-by: Eryk Sun <firstname.lastname@example.org> * pythongh-99947: Ensure unreported errors are chained for SystemError during import (pythonGH-99946) * Add "strict" to dotproduct(). Add docstring. Factor-out common code. (pythonGH-100480) * pythongh-94808: improve test coverage of number formatting (python#99472) * pythongh-100454: Start running SSL tests with OpenSSL 3.1.0-beta1 (python#100456) * pythongh-100268: Add is_integer method to int (python#100439) This improves the lives of type annotation users of `float` - which type checkers implicitly treat as `int|float` because that is what most code actually wants. Before this change a `.is_integer()` method could not be assumed to exist on things annotated as `: float` due to the method not existing on both types. * pythongh-77771: Add enterabs example in sched (python#92716) Co-authored-by: Shantanu <email@example.com> * pythonGH-91166: Implement zero copy writes for `SelectorSocketTransport` in asyncio (python#31871) Co-authored-by: Guido van Rossum <firstname.lastname@example.org> * pythonGH-91166: Implement zero copy writes for `SelectorSocketTransport` in asyncio (python#31871) Co-authored-by: Guido van Rossum <email@example.com> * Misc Itertools recipe tweaks (pythonGH-100493) * pythongh-100357: Convert several functions in `bltinsmodule` to AC (python#100358) * Remove wrong comment about `repr` in `test_unicode` (python#100495) * pythongh-99908: Tutorial: Modernize the 'data-record class' example (python#100499) Co-authored-by: Alex Waygood <Alex.Waygood@Gmail.com> * pythongh-100474: Fix handling of dirs named index.html in http.server (pythonGH-100475) If you had a directory called index.html or index.htm within a directory, it would cause http.server to return a 404 Not Found error instead of the directory listing. This came about due to not checking that the index was a regular file. I have also added a test case for this situation. Automerge-Triggered-By: GH:merwok * pythongh-100287: Fix unittest.mock.seal with AsyncMock (python#100496) * pythongh-99535: Add test for inheritance of annotations and update documentation (python#99990) * pythongh-100428: Make float documentation more accurate (python#100437) Previously, the grammar did not accept `float("10")`. Also implement mdickinson's suggestion of removing the indirection. * [Minor PR] Quotes in documentation changed into code blocks (python#99536) Minor formatting fix in documentation Co-authored-by: Shantanu <firstname.lastname@example.org> * pythongh-100472: Fix docs claim that compileall parameters could be bytes (python#100473) * pythongh-100519: simplification to `eff_request_host` in cookiejar.py (python#99588) `IPV4_RE` includes a `.`, and the `.find(".") == -1` included here is already testing to make sure there's no dot, so this part of the expression is tautological. Instead use more modern `in` syntax to make it clear what the check is doing here. The simplified implementation more clearly matches the wording in RFC 2965. Co-authored-by: hauntsaninja <email@example.com> * pythongh-99308: Clarify re docs for byte pattern group names (python#99311) * pythongh-92446: Improve argparse choices docs; revert bad change to lzma docs (python#94627) Based on the definition of the collections.abc classes, it is more accurate to use "sequence" instead of "container" when describing argparse choices. A previous attempt at fixing this in python#92450 was mistaken; this PR reverts that change. Co-authored-by: Shantanu <firstname.lastname@example.org> * Fix name of removed `inspect.Signature.from_builtin` method in 3.11.0a2 changelog (python#100525) * pythongh-100520: Fix `rst` markup in `configparser` docstrings (python#100524) * pythongh-99509: Add `__class_getitem__` to `multiprocessing.queues.Queue` (python#99511) * pythongh-94603: micro optimize list.pop (pythongh-94604) * Remove `NoneType` redefinition from `clinic.py` (python#100551) * pythongh-100553: Improve accuracy of sqlite3.Row iter test (python#100555) * pythonGH-98831: Modernize a ton of simpler instructions (python#100545) * load_const and load_fast aren't families for now * Don't decref unmoved names * Modernize GET_ANEXT * Modernize GET_AWAITABLE * Modernize ASYNC_GEN_WRAP * Modernize YIELD_VALUE * Modernize POP_EXCEPT (in more than one way) * Modernize PREP_RERAISE_STAR * Modernize LOAD_ASSERTION_ERROR * Modernize LOAD_BUILD_CLASS * Modernize STORE_NAME * Modernize LOAD_NAME * Modernize LOAD_CLASSDEREF * Modernize LOAD_DEREF * Modernize STORE_DEREF * Modernize COPY_FREE_VARS (mark it as done) * Modernize LIST_TO_TUPLE * Modernize LIST_EXTEND * Modernize SET_UPDATE * Modernize SETUP_ANNOTATIONS * Modernize DICT_UPDATE * Modernize DICT_MERGE * Modernize MAP_ADD * Modernize IS_OP * Modernize CONTAINS_OP * Modernize CHECK_EXC_MATCH * Modernize IMPORT_NAME * Modernize IMPORT_STAR * Modernize IMPORT_FROM * Modernize JUMP_FORWARD (mark it as done) * Modernize JUMP_BACKWARD (mark it as done) Signed-off-by: Filipe Laíns <email@example.com> Signed-off-by: Filipe Laíns <firstname.lastname@example.org> Co-authored-by: Jeremy Paige <email@example.com> Co-authored-by: Carlton Gibson <firstname.lastname@example.org> Co-authored-by: Hugo van Kemenade <email@example.com> Co-authored-by: Jon Burdo <firstname.lastname@example.org> Co-authored-by: Stanley <email@example.com> Co-authored-by: Jelle Zijlstra <firstname.lastname@example.org> Co-authored-by: Thomas Grainger <email@example.com> Co-authored-by: Brad Wolfe <firstname.lastname@example.org> Co-authored-by: Richard Kojedzinszky <email@example.com> Co-authored-by: František Nesveda <firstname.lastname@example.org> Co-authored-by: Pablo Galindo Salgado <Pablogsal@gmail.com> Co-authored-by: Nikita Sobolev <email@example.com> Co-authored-by: Łukasz Langa <firstname.lastname@example.org> Co-authored-by: Dennis Sweeney <email@example.com> Co-authored-by: Bisola Olasehinde <firstname.lastname@example.org> Co-authored-by: C.A.M. Gerlach <CAM.Gerlach@Gerlach.CAM> Co-authored-by: Pieter Eendebak <P.T.email@example.com> Co-authored-by: Shantanu <firstname.lastname@example.org> Co-authored-by: Kumar Aditya <email@example.com> Co-authored-by: Dominic Socular <BBH@awsl.rip> Co-authored-by: Serhiy Storchaka <firstname.lastname@example.org> Co-authored-by: Hai Shi <email@example.com> Co-authored-by: amaajemyfren <firstname.lastname@example.org> Co-authored-by: Brandt Bucher <email@example.com> Co-authored-by: david-why <firstname.lastname@example.org> Co-authored-by: Pieter Eendebak <email@example.com> Co-authored-by: penguin_wwy <firstname.lastname@example.org> Co-authored-by: Eli Schwartz <email@example.com> Co-authored-by: Itamar Ostricher <firstname.lastname@example.org> Co-authored-by: Alex Waygood <Alex.Waygood@Gmail.com> Co-authored-by: Eric Wieser <email@example.com> Co-authored-by: Irit Katriel <firstname.lastname@example.org> Co-authored-by: Bill Fisher <email@example.com> Co-authored-by: Petr Viktorin <firstname.lastname@example.org> Co-authored-by: Ken Jin <email@example.com> Co-authored-by: Carl Meyer <firstname.lastname@example.org> Co-authored-by: Filipe Laíns <email@example.com> Co-authored-by: Raymond Hettinger <firstname.lastname@example.org> Co-authored-by: Barney Gale <email@example.com> Co-authored-by: Brett Cannon <firstname.lastname@example.org> Co-authored-by: Adam Turner <9087854+AA-Turner@users.noreply.github.com> Co-authored-by: Eryk Sun <email@example.com> Co-authored-by: Sebastian Berg <firstname.lastname@example.org> Co-authored-by: Illia Volochii <email@example.com> Co-authored-by: JosephSBoyle <48555120+JosephSBoyle@users.noreply.github.com> Co-authored-by: James Frost <firstname.lastname@example.org> Co-authored-by: MonadChains <email@example.com> Co-authored-by: Bart Broere <firstname.lastname@example.org> Co-authored-by: Glyph <email@example.com> Co-authored-by: hauntsaninja <firstname.lastname@example.org> Co-authored-by: Ilya Kulakov <email@example.com> Co-authored-by: Guy Yagev <firstname.lastname@example.org> Co-authored-by: Jakub Kuczys <email@example.com>