-
-
Notifications
You must be signed in to change notification settings - Fork 31.8k
[3.14] annotationlib - Union '|' syntax and typing.Union[...] generate different forward references. #132805
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
Comments
Good catch. I think this is a more general problem though, for example:
A more general approach to fix this would be to change the case in |
Ah, yes you're right. Sounds similar to what |
…ARDREF (#132812) Co-authored-by: David C Ellis <ducksual@gmail.com>
* 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) ...
Bug report
Bug description:
While looking into #125618 I ran into this case.
Using the union syntax gives a
ForwardRef
that can't be evaluated as the class that can be evaluated gets converted into itsrepr
viaast.Constant
. Using thetyping.Union
class however gives a proper union object where only the undefined value is a forwardref.str | undefined
->ForwardRef("<class 'str'> | undefined")
Union[str, undefined]
->str | ForwardRef("undefined")
Example:
Formatted Output:
One possible solution to this is to add a
create_unions
attribute to the_StringifierDict
. If this isTrue
then the__or__
and__ror__
methods should createtypes.UnionType
instances instead of calling__make_new
. This isFalse
forFormat.STRING
in order to keepa | b
in the reproduction in that case.I already have a branch with this approach so I can make a PR.
Doing this will break the current
test_nonexistent_attribute
ForwardRef test assome | obj
would evaluate toForwardRef('some') | ForwardRef('obj')
instead ofForwardRef('some | obj')
but I think this is probably correct and the test should be changed.CPython versions tested on:
CPython main branch
Operating systems tested on:
No response
Linked PRs
The text was updated successfully, but these errors were encountered: