mypy 0.942 仅在 Linux 上拒绝 'match'?

mypy 0.942 rejects 'match' only on Linux?

mypy 0.942 判断此程序在 Mac OS 12.2.1 上正确,但拒绝第二行作为 Ubuntu 上的语法错误18.04:

e = 'a'
match e:
    case name if isinstance(e, str):
        print('name', e)
    case x if isinstance(e, int):
        print('int', e)

我在两个系统上运行相同的命令:

mypy --python-version 3.10 x.py

我是做错了什么还是应该将其报告为错误?

我没有 mypy.ini 文件。我尝试删除 .mypy_cache 目录并得到相同的结果。


这是带有 -v(详细)标志的输出:

$ mypy --python-version 3.10 -v --python-executable /home/bkovitz/local/bin/python3.10 x.py 
LOG:  Could not load plugins snapshot: @plugins_snapshot.json

LOG:  Mypy Version:           0.942
LOG:  Config File:            Default
LOG:  Configured Executable:  /home/bkovitz/local/bin/python3.10
LOG:  Current Executable:     /usr/bin/python3
LOG:  Cache Dir:              .mypy_cache
LOG:  Compiled:               True
LOG:  Exclude:                []
LOG:  Found source:           BuildSource(path='x.py', module='x', has_text=False, base_dir='/home/bkovitz/stuff')
LOG:  Could not load cache for x: x.meta.json
LOG:  Metadata not found for x
LOG:  Parsing x.py (x)
LOG:  Bailing due to parse errors
LOG:  Build finished in 0.011 seconds with 0 modules, and 1 errors
x.py:2: error: invalid syntax  [syntax]
Found 1 error in 1 file (errors prevented further checking)

我看到 Current Executable 是错误的:那是 Python 3.6.9(Ubuntu 需要)。那python3不是第一个PATHPATH 中的第一个 python3Configured Executable 在同一目录中,并且是 Python 3.10.2.

问题是 mypy 脚本中的 shebang 行调用了错误的 python3 可执行文件。我把 ~/local/bin/mypy 的第一行改成了:

#!/usr/bin/python3

对此:

#!/home/bkovitz/local/bin/python3

它奏效了。后者是 Python 3.10,与 Python 3.6.9.

不同,它大概有一个可以为 match 语句制作 AST 的解析器

我还必须在 shell 提示符下 运行 hash -r。 shell 缓存了以前版本的 mypy 脚本,因此编辑文件无效 (!)。