Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

Fixes for Python 3.14 and PEP 649 #492

Draft
wants to merge 4 commits into
base: master
Choose a base branch
from

Conversation

JelleZijlstra
Copy link
Contributor

@JelleZijlstra JelleZijlstra commented Sep 23, 2024

I ran the typeguard test suite on the current CPython main branch to
look for possible breakage from PEP 649 and 749, which makes large
changes to how annotations work.

I found three problems:

  • DeprecationWarnings from uses of ForwardRef._evaluate, which we're
    deprecating. Made a change to use the new public API for ForwardRef.evaluate
    instead.
  • A test failure that showed "annotationlib" as the module name for a forward
    ref. I made it so that it doesn't use module for ForwardRef objects.
  • One remaining test failure that I haven't tracked down:
    tests/test_instrumentation.py::test_typevar_forwardref[importhook]
    It's apparently due to caching (it doesn't fail if I run only that one test),
    but I haven't tracked down the exact cause.

I also added some new tests relying on 3.14-only behavior (unquoted annotations containing forward references). Those mostly worked fine, but I had to make another tweak to how functions are wrapped.

Since the APIs in Python 3.14 may still change, I'll make this a draft
PR for now.

Checklist

If this is a user-facing code change, like a bugfix or a new feature, please ensure that
you've fulfilled the following conditions (where applicable):

  • You've added tests (in tests/) added which would fail without your patch
  • You've updated the documentation (in docs/, in case of behavior changes or new
    features)
  • You've added a new changelog entry (in docs/versionhistory.rst).

I ran the typeguard test suite on the current CPython main branch to
look for possible breakage from PEP 649 and 749, which makes large
changes to how annotations work.

I found three problems:

- DeprecationWarnings from uses of ForwardRef._evaluate, which we're
  deprecating. Made a change to use the new public API for ForwardRef.evaluate
  instead.
- A test failure that showed "annotationlib" as the module name for a forward
  ref. I made it so that it doesn't use __module__ for ForwardRef objects.
- One remaining test failure that I haven't tracked down:
  tests/test_instrumentation.py::test_typevar_forwardref[importhook]
  It's apparently due to caching (it doesn't fail if I run only that one test),
  but I haven't tracked down the exact cause.

Since the APIs in Python 3.14 may still change, I'll make this a draft
PR for now.
@coveralls
Copy link

coveralls commented Sep 23, 2024

Coverage Status

coverage: 94.299% (-0.2%) from 94.511%
when pulling 0eb5220 on JelleZijlstra:fix314
into b6a7e43 on agronholm:master.

@musicinmybrain
Copy link

Thanks for working on this! I just tested this branch with Python 3.14.0a1, and it looks like some further adjustments will be required:

========================================================================================== short test summary info ==========================================================================================
FAILED tests/test_instrumentation.py::test_typevar_forwardref[importhook] - typeguard.TypeCheckError: argument "x" (class dummymodule.DummyClass) is not a subclass of dummymodule.DummyClass
ERROR tests/test_instrumentation.py::TestUsesForwardRef::test_success[typechecked] - ModuleNotFoundError: No module named 'deferredannos'
ERROR tests/test_instrumentation.py::TestUsesForwardRef::test_failure[typechecked] - ModuleNotFoundError: No module named 'deferredannos'
ERROR tests/test_instrumentation.py::TestUsesForwardRef::test_success[importhook] - ModuleNotFoundError: No module named 'deferredannos'
ERROR tests/test_instrumentation.py::TestUsesForwardRef::test_failure[importhook] - ModuleNotFoundError: No module named 'deferredannos'
======================================================================= 1 failed, 474 passed, 4 skipped, 9 xfailed, 4 errors in 2.13s =======================================================================

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment
Labels
None yet
Projects
None yet
Development

Successfully merging this pull request may close these issues.

4 participants