Skip to content

Generic of TypeVar causes SCC singleton as inherently stale, when used with match syntax #13213

@pechersky

Description

@pechersky

Crash Report

I am trying to write a generic type to hold the type of a column, as parsed from a text-based table format. I want to have a type of "column type" that holds the underlying python type.

Traceback


LOG:  Mypy Version:           0.971
LOG:  Config File:            setup.cfg
LOG:  Configured Executable:  /home/yakov/.cache/pypoetry/virtualenvs/repo-0gsef-ws-py3.10/bin/python
LOG:  Current Executable:     /home/yakov/.cache/pypoetry/virtualenvs/repo-0gsef-ws-py3.10/bin/python
LOG:  Cache Dir:              .mypy_cache
LOG:  Compiled:               True
LOG:  Exclude:                ['(dxp_scripts)']
LOG:  Found source:           BuildSource(path='bug.py', module='bug', has_text=False, base_dir='/home/yakov/orion/repo')
LOG:  Could not load cache for bug: bug.meta.json
LOG:  Metadata not found for bug
LOG:  Parsing bug.py (bug)
LOG:  Metadata fresh for typing: file /home/yakov/.cache/pypoetry/virtualenvs/repo-0gsef-ws-py3.10/lib/python3.10/site-packages/mypy/typeshed/stdlib/typing.pyi
LOG:  Metadata fresh for builtins: file /home/yakov/.cache/pypoetry/virtualenvs/repo-0gsef-ws-py3.10/lib/python3.10/site-packages/mypy/typeshed/stdlib/builtins.pyi
LOG:  Metadata fresh for collections: file /home/yakov/.cache/pypoetry/virtualenvs/repo-0gsef-ws-py3.10/lib/python3.10/site-packages/mypy/typeshed/stdlib/collections/__init__.pyi
LOG:  Metadata fresh for sys: file /home/yakov/.cache/pypoetry/virtualenvs/repo-0gsef-ws-py3.10/lib/python3.10/site-packages/mypy/typeshed/stdlib/sys.pyi
LOG:  Metadata fresh for _typeshed: file /home/yakov/.cache/pypoetry/virtualenvs/repo-0gsef-ws-py3.10/lib/python3.10/site-packages/mypy/typeshed/stdlib/_typeshed/__init__.pyi
LOG:  Metadata fresh for abc: file /home/yakov/.cache/pypoetry/virtualenvs/repo-0gsef-ws-py3.10/lib/python3.10/site-packages/mypy/typeshed/stdlib/abc.pyi
LOG:  Metadata fresh for types: file /home/yakov/.cache/pypoetry/virtualenvs/repo-0gsef-ws-py3.10/lib/python3.10/site-packages/mypy/typeshed/stdlib/types.pyi
LOG:  Metadata fresh for typing_extensions: file /home/yakov/.cache/pypoetry/virtualenvs/repo-0gsef-ws-py3.10/lib/python3.10/site-packages/mypy/typeshed/stdlib/typing_extensions.pyi
LOG:  Metadata fresh for _ast: file /home/yakov/.cache/pypoetry/virtualenvs/repo-0gsef-ws-py3.10/lib/python3.10/site-packages/mypy/typeshed/stdlib/_ast.pyi
LOG:  Metadata fresh for _collections_abc: file /home/yakov/.cache/pypoetry/virtualenvs/repo-0gsef-ws-py3.10/lib/python3.10/site-packages/mypy/typeshed/stdlib/_collections_abc.pyi
LOG:  Metadata fresh for collections.abc: file /home/yakov/.cache/pypoetry/virtualenvs/repo-0gsef-ws-py3.10/lib/python3.10/site-packages/mypy/typeshed/stdlib/collections/abc.pyi
LOG:  Metadata fresh for io: file /home/yakov/.cache/pypoetry/virtualenvs/repo-0gsef-ws-py3.10/lib/python3.10/site-packages/mypy/typeshed/stdlib/io.pyi
LOG:  Metadata fresh for importlib.abc: file /home/yakov/.cache/pypoetry/virtualenvs/repo-0gsef-ws-py3.10/lib/python3.10/site-packages/mypy/typeshed/stdlib/importlib/abc.pyi
LOG:  Metadata fresh for importlib.machinery: file /home/yakov/.cache/pypoetry/virtualenvs/repo-0gsef-ws-py3.10/lib/python3.10/site-packages/mypy/typeshed/stdlib/importlib/machinery.pyi
LOG:  Metadata fresh for array: file /home/yakov/.cache/pypoetry/virtualenvs/repo-0gsef-ws-py3.10/lib/python3.10/site-packages/mypy/typeshed/stdlib/array.pyi
LOG:  Metadata fresh for ctypes: file /home/yakov/.cache/pypoetry/virtualenvs/repo-0gsef-ws-py3.10/lib/python3.10/site-packages/mypy/typeshed/stdlib/ctypes/__init__.pyi
LOG:  Metadata fresh for mmap: file /home/yakov/.cache/pypoetry/virtualenvs/repo-0gsef-ws-py3.10/lib/python3.10/site-packages/mypy/typeshed/stdlib/mmap.pyi
LOG:  Metadata fresh for pickle: file /home/yakov/.cache/pypoetry/virtualenvs/repo-0gsef-ws-py3.10/lib/python3.10/site-packages/mypy/typeshed/stdlib/pickle.pyi
LOG:  Metadata fresh for os: file /home/yakov/.cache/pypoetry/virtualenvs/repo-0gsef-ws-py3.10/lib/python3.10/site-packages/mypy/typeshed/stdlib/os/__init__.pyi
LOG:  Metadata fresh for codecs: file /home/yakov/.cache/pypoetry/virtualenvs/repo-0gsef-ws-py3.10/lib/python3.10/site-packages/mypy/typeshed/stdlib/codecs.pyi
LOG:  Metadata fresh for importlib: file /home/yakov/.cache/pypoetry/virtualenvs/repo-0gsef-ws-py3.10/lib/python3.10/site-packages/mypy/typeshed/stdlib/importlib/__init__.pyi
LOG:  Metadata fresh for importlib.metadata: file /home/yakov/.cache/pypoetry/virtualenvs/repo-0gsef-ws-py3.10/lib/python3.10/site-packages/mypy/typeshed/stdlib/importlib/metadata/__init__.pyi
LOG:  Metadata fresh for os.path: file /home/yakov/.cache/pypoetry/virtualenvs/repo-0gsef-ws-py3.10/lib/python3.10/site-packages/mypy/typeshed/stdlib/os/path.pyi
LOG:  Metadata fresh for contextlib: file /home/yakov/.cache/pypoetry/virtualenvs/repo-0gsef-ws-py3.10/lib/python3.10/site-packages/mypy/typeshed/stdlib/contextlib.pyi
LOG:  Metadata fresh for subprocess: file /home/yakov/.cache/pypoetry/virtualenvs/repo-0gsef-ws-py3.10/lib/python3.10/site-packages/mypy/typeshed/stdlib/subprocess.pyi
LOG:  Metadata fresh for _codecs: file /home/yakov/.cache/pypoetry/virtualenvs/repo-0gsef-ws-py3.10/lib/python3.10/site-packages/mypy/typeshed/stdlib/_codecs.pyi
LOG:  Metadata fresh for pathlib: file /home/yakov/.cache/pypoetry/virtualenvs/repo-0gsef-ws-py3.10/lib/python3.10/site-packages/mypy/typeshed/stdlib/pathlib.pyi
LOG:  Metadata fresh for email.message: file /home/yakov/.cache/pypoetry/virtualenvs/repo-0gsef-ws-py3.10/lib/python3.10/site-packages/mypy/typeshed/stdlib/email/message.pyi
LOG:  Metadata fresh for importlib.metadata._meta: file /home/yakov/.cache/pypoetry/virtualenvs/repo-0gsef-ws-py3.10/lib/python3.10/site-packages/mypy/typeshed/stdlib/importlib/metadata/_meta.pyi
LOG:  Metadata fresh for posixpath: file /home/yakov/.cache/pypoetry/virtualenvs/repo-0gsef-ws-py3.10/lib/python3.10/site-packages/mypy/typeshed/stdlib/posixpath.pyi
LOG:  Metadata fresh for email: file /home/yakov/.cache/pypoetry/virtualenvs/repo-0gsef-ws-py3.10/lib/python3.10/site-packages/mypy/typeshed/stdlib/email/__init__.pyi
LOG:  Metadata fresh for email.charset: file /home/yakov/.cache/pypoetry/virtualenvs/repo-0gsef-ws-py3.10/lib/python3.10/site-packages/mypy/typeshed/stdlib/email/charset.pyi
LOG:  Metadata fresh for email.contentmanager: file /home/yakov/.cache/pypoetry/virtualenvs/repo-0gsef-ws-py3.10/lib/python3.10/site-packages/mypy/typeshed/stdlib/email/contentmanager.pyi
LOG:  Metadata fresh for email.errors: file /home/yakov/.cache/pypoetry/virtualenvs/repo-0gsef-ws-py3.10/lib/python3.10/site-packages/mypy/typeshed/stdlib/email/errors.pyi
LOG:  Metadata fresh for email.policy: file /home/yakov/.cache/pypoetry/virtualenvs/repo-0gsef-ws-py3.10/lib/python3.10/site-packages/mypy/typeshed/stdlib/email/policy.pyi
LOG:  Metadata fresh for genericpath: file /home/yakov/.cache/pypoetry/virtualenvs/repo-0gsef-ws-py3.10/lib/python3.10/site-packages/mypy/typeshed/stdlib/genericpath.pyi
LOG:  Metadata fresh for email.header: file /home/yakov/.cache/pypoetry/virtualenvs/repo-0gsef-ws-py3.10/lib/python3.10/site-packages/mypy/typeshed/stdlib/email/header.pyi
LOG:  Loaded graph with 38 nodes (0.019 sec)
LOG:  Found 2 SCCs; largest has 37 nodes
LOG:  Processing 1 queued fresh SCCs
LOG:  Processing SCC singleton (bug) as inherently stale
bug.py:11: error: INTERNAL ERROR -- Please try using mypy master on GitHub:
https://mypy.readthedocs.io/en/stable/common_issues.html#using-a-development-mypy-build
Please report a bug at https://github.com/python/mypy/issues
version: 0.971
bug.py:11: : note: use --pdb to drop into pdb
LOG:  Build finished in 0.163 seconds with 38 modules, and 0 errors
Traceback (most recent call last):
  File "mypy/checker.py", line 435, in accept
  File "mypy/nodes.py", line 758, in accept
  File "mypy/checker.py", line 786, in visit_func_def
  File "mypy/checker.py", line 790, in _visit_func_def
  File "mypy/checker.py", line 852, in check_func_item
  File "mypy/checker.py", line 872, in check_func_def
  File "mypy/checker.py", line 1492, in expand_typevars
  File "mypy/checker.py", line 6133, in expand_func
  File "mypy/nodes.py", line 758, in accept
  File "mypy/treetransform.py", line 115, in visit_func_def
  File "mypy/treetransform.py", line 580, in block
  File "mypy/treetransform.py", line 194, in visit_block
  File "mypy/treetransform.py", line 591, in statements
  File "mypy/treetransform.py", line 564, in stmt
TypeError: mypy.nodes.Node object expected; got None

To Reproduce

# bug.py
from typing import Generic, Type, TypeVar

ColumnType = TypeVar("ColumnType", str, bool)

class ValueType(Generic[ColumnType]):
    """The type of values that exist in a column."""

    string = "String"
    boolean = "Bool"

    def astype(self) -> Type[ColumnType]:
        """Interpret the text type as a python type.

        Returns:
            the python type that this value type represents.
        """
        match self:
            case ValueType.string:
                return str
            case ValueType.boolean:
                return bool

Your Environment

  • Mypy version used: 0.971
  • Mypy command-line flags: mypy bug.py --ignore-missing-imports --strict --show-error-code --show-traceback -v > mypy.log 2>&1
  • Mypy configuration options from mypy.ini (and other config files):
[mypy]
follow_imports = silent
strict_optional = True
warn_redundant_casts = True
warn_unused_ignores = True
disallow_any_generics = True
check_untyped_defs = True
no_implicit_reexport = True
disallow_untyped_defs = True
ignore_missing_imports = True
enable_error_code = ignore-without-code
strict = True
exclude = (dxp_scripts)
  • Python version used: 3.10
  • Operating system and version:
$ uname -a                                                         
Linux LT-YPECHERSKY 5.10.102.1-microsoft-standard-WSL2 #1 SMP Wed Mar 2 00:30:59 UTC 2022 x86_64 x86_64 x86_64 GNU/Linux
$ pip list
Package              Version
-------------------- ---------
arrow                1.2.2
attrs                21.4.0
binaryornot          0.4.4
black                22.6.0
certifi              2022.6.15
cfgv                 3.3.1
chardet              5.0.0
charset-normalizer   2.1.0
click                8.1.3
click-default-group  1.2.2
cookiecutter         1.7.3
coverage             5.5
cruft                2.10.2
darglint             1.8.1
distlib              0.3.5
filelock             3.7.1
flake8               4.0.1
flake8-docstrings    1.6.0
gitdb                4.0.9
GitPython            3.1.27
identify             2.5.2
idna                 3.3
importlib-resources  5.8.0
incremental          21.3.0
iniconfig            1.1.1
isort                5.10.1
Jinja2               3.1.2
jinja2-time          0.2.0
MarkupSafe           2.1.1
mccabe               0.6.1
mypy                 0.971
mypy-extensions      0.4.3
nodeenv              1.7.0
packaging            21.3
parsy                1.4.0
pathspec             0.9.0
pip                  22.1.2
platformdirs         2.5.2
pluggy               1.0.0
poetry-core          1.0.8
poyo                 0.5.0
pre-commit           2.20.0
py                   1.11.0
pycodestyle          2.8.0
pydocstyle           6.1.1
pyflakes             2.4.0
pyparsing            3.0.9
pytest               6.2.5
pytest-cov           3.0.0
pytest-mock          3.8.2
python-dateutil      2.8.2
python-slugify       6.1.2
PyYAML               6.0
requests             2.28.1
setuptools           62.6.0
six                  1.16.0
smmap                5.0.0
snowballstemmer      2.2.0
text-unidecode       1.3
tl-spotfire          0.1.0
toml                 0.10.2
tomli                2.0.1
towncrier            21.9.0
tox                  3.25.1
tox-gh-actions       2.9.1
tox-poetry-installer 0.8.4
typer                0.4.2
typing_extensions    4.3.0
urllib3              1.26.10
virtualenv           20.15.1
wheel                0.37.1
xdoctest             0.15.10

There is a related attempt that does not have the INTERNAL ERROR, which still indicates to me that something might be wrong:

from typing import Generic, Type, TypeVar

ColumnType = TypeVar("ColumnType", str, bool)

class ValueType(Generic[ColumnType]):
    """The type of values that exist in a column."""

    string = "String"
    boolean = "Bool"

    def astype(self) -> Type[ColumnType]:
        """Interpret the text type as a python type.

        Returns:
            the python type that this value type represents.
        """
        if self == ValueType.string:
            return str
        return bool
$ mypy bug.py --ignore-missing-imports --strict --show-error-code --show-traceback    
bug.py:40: error: Incompatible return value type (got "Type[str]", expected "Type[bool]")  [return-value]
bug.py:41: error: Incompatible return value type (got "Type[bool]", expected "Type[str]")  [return-value]

Metadata

Metadata

Assignees

No one assigned

    Projects

    No projects

    Milestone

    No milestone

    Relationships

    None yet

    Development

    No branches or pull requests

    Issue actions