[New-bugs-announce] [issue39308] Literal[True] interpreted as Literal[1]

Tomasz Trębski report at bugs.python.org
Sat Jan 11 18:35:15 EST 2020


New submission from Tomasz Trębski <kornicameister at gmail.com>:

Consider code (in attachment) that is being run on Python 3.9.
An expected output of such code ought to be:

(typing_extensions.Literal[1], typing_extensions.Literal[0]) (typing_extensions.Literal[True], typing_extensions.Literal[False])

However that's not the case. An output of the code, given that A is declared first, will be:

(typing.Literal[1], typing.Literal[0]) (typing.Literal[1], typing.Literal[0])

and if B is declared first we receive:

(typing.Literal[True], typing.Literal[False]) (typing.Literal[True], typing.Literal[False])

I believe a reason for that is having `bool` as subclass of `int` and consecutively having `typing._tp_cache` function that declares untyped cache. Indeed changing `cached = functools.lru_cache()(func)` to `cached = functools.lru_cache(typed=True)(func)` makes the linked code immune to A and B deceleration order.

----------
components: ctypes
files: scratch_1.py
messages: 359822
nosy: Tomasz Trębski
priority: normal
severity: normal
status: open
title: Literal[True] interpreted as Literal[1]
type: behavior
versions: Python 3.9
Added file: https://bugs.python.org/file48835/scratch_1.py

_______________________________________
Python tracker <report at bugs.python.org>
<https://bugs.python.org/issue39308>
_______________________________________


More information about the New-bugs-announce mailing list