Skip to content

annotationlib: namespace can be non-dict #132426

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

Closed
eliegoudout opened this issue Apr 12, 2025 · 4 comments
Closed

annotationlib: namespace can be non-dict #132426

eliegoudout opened this issue Apr 12, 2025 · 4 comments
Labels
3.14 bugs and security fixes stdlib Python modules in the Lib dir topic-typing type-bug An unexpected behavior, bug, or error

Comments

@eliegoudout
Copy link

eliegoudout commented Apr 12, 2025

Hello!

I think the following, made so that get_annotate_function is usable in metaclasses' __new__, should check for Mapping since __prepare__ can provide any mapping (see picture from PEP3115.

if isinstance(obj, dict):

Image

Linked PRs

eliegoudout added a commit to eliegoudout/cpython that referenced this issue Apr 12, 2025
@eliegoudout
Copy link
Author

eliegoudout commented Apr 12, 2025

However, I now realize that this is a major issue since there might be a conflict between the Mapping subtype's own annotations and the annotations it contains as a mapping for another type's namespace.

Shouldn't we separate get_annotate_function into get_annotate_function and get_namespace_annotations? Or maybe add a keyword get_annotate_function(obj, *, is_namespace: bool)?

@picnixz picnixz added type-bug An unexpected behavior, bug, or error stdlib Python modules in the Lib dir topic-typing labels Apr 12, 2025
@picnixz
Copy link
Member

picnixz commented Apr 12, 2025

cc @JelleZijlstra

@picnixz picnixz added the 3.14 bugs and security fixes label Apr 12, 2025
@JelleZijlstra JelleZijlstra pinned this issue Apr 12, 2025
@JelleZijlstra JelleZijlstra unpinned this issue Apr 12, 2025
@JelleZijlstra
Copy link
Member

Good point! I think what I'd like to do is drop get_annotate_function completely (it's now equivalent to a simple getattr call and doesn't need to be a function) and add a new function get_annotate_from_class_namespace.

Your proposed change is a bit dubious because "mapping" at the C level means something a little different (it basically just checks for the mp_subscr slot). Not sure if that will cause practical problems but better to be safe.

However, I now realize that this is a major issue since there might be a conflict between the Mapping subtype's own annotations and the annotations it contains as a mapping for another type's namespace.

Since instances no longer have accessible annotations by default, this will only be a problem in exotic cases like a Mapping that is also an instance of type. But again, better to be safe.

JelleZijlstra added a commit to JelleZijlstra/cpython that referenced this issue Apr 14, 2025
…annotate_function

As noted on the issue, making get_annotate_function() support both types and
mappings is problematic because one object may be both. So let's add a new one
that works with any mapping.

This leaves get_annotate_function() not very useful, so remove it.
JelleZijlstra added a commit that referenced this issue May 4, 2025
…te_function (#132490)

As noted on the issue, making get_annotate_function() support both types and
mappings is problematic because one object may be both. So let's add a new one
that works with any mapping.

This leaves get_annotate_function() not very useful, so remove it.
@JelleZijlstra
Copy link
Member

Fixed by #132490, thanks for the report!

diegorusso added a commit to diegorusso/cpython that referenced this issue May 4, 2025
* origin/main: (111 commits)
  pythongh-91048: Add filename and line number to external inspection routines (pythonGH-133385)
  pythongh-131178: Add tests for `ast` command-line interface (python#133329)
  Regenerate pcbuild.sln in Visual Studio 2022 (python#133394)
  pythongh-133042: disable HACL* HMAC on Emscripten (python#133064)
  pythongh-133351: Fix remote PDB's multi-line block tab completion (python#133387)
  pythongh-109700: Improve stress tests for interpreter creation (pythonGH-109946)
  pythongh-81793: Skip tests for os.link() to symlink on Android (pythonGH-133388)
  pythongh-126835: Rename `ast_opt.c` to `ast_preprocess.c` and related stuff after moving const folding to the peephole optimizier (python#131830)
  pythongh-91048: Relax test_async_global_awaited_by to fix flakyness (python#133368)
  pythongh-132457: make staticmethod and classmethod generic (python#132460)
  pythongh-132805: annotationlib: Fix handling of non-constant values in FORWARDREF (python#132812)
  pythongh-132426: Add get_annotate_from_class_namespace replacing get_annotate_function (python#132490)
  pythongh-81793: Always call linkat() from os.link(), if available (pythonGH-132517)
  pythongh-122559: Synchronize C and Python implementation of the io module about pickling (pythonGH-122628)
  pythongh-69605: Add PyREPL import autocomplete feature to 'What's New' (python#133358)
  bpo-44172: Keep reference to original window in curses subwindow objects (pythonGH-26226)
  pythonGH-133231: Changes to executor management to support proposed `sys._jit` module (pythonGH-133287)
  pythongh-133363: Fix Cmd completion for lines beginning with `! ` (python#133364)
  pythongh-132983: Introduce `_zstd` bindings module (pythonGH-133027)
  pythonGH-91048: Add utils for printing the call stack for asyncio tasks (python#133284)
  ...
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment
Labels
3.14 bugs and security fixes stdlib Python modules in the Lib dir topic-typing type-bug An unexpected behavior, bug, or error
Projects
None yet
Development

Successfully merging a pull request may close this issue.

3 participants