专门化正则表达式类型 re.Pattern

Specialize the regex type re.Pattern

re.Pattern的类型特化为re.Pattern[bytes]mypy正确检测到类型错误:

import re
REGEX: re.Pattern[bytes] = re.compile(b"\xab.{2}")
def check(pattern: str) -> bool:
    if str == "xyz":
        return REGEX.fullmatch(pattern) is not None
    return True
print(check("abcd"))

检测到类型不匹配:

$ mypy ~/main.py 
/home/oren/main.py:5: error: Argument 1 to "fullmatch" of "Pattern" has incompatible type "str"; expected "bytes"
Found 1 error in 1 file (checked 1 source file)

然而,当我尝试实际 运行 代码时,我收到一条奇怪的 (?) 消息:

$ python ~/main.py
Traceback (most recent call last):
  File "/home/oren/main.py", line 2, in <module>
    REGEX: re.Pattern[bytes] = re.compile(b"\xab.{2}")
TypeError: 'type' object is not subscriptable

类型注释怎么会麻烦 Python?

您是否尝试使用 typing 模块?我认为这里出现问题是因为 re.Pattern[bytes] 表达式不能像你想的那样使用。 试试 typing.re.Pattern[bytes].

I checked it on python3.7 and it works

在 Python 3.9 中添加了使用 [str][bytes] 专门化通用 re.Patternre.Match 类型的能力。您似乎使用的是较旧的 Python 版本。

对于早于 3.8 的 Python 版本,typing 模块提供了一个 typing.re 命名空间,其中包含用于此目的的替换类型。

自 Python 3.8 起,它们在 typing 模块中直接可用,并且 typing.re 名称空间已弃用(将在 Python 3.12 中删除)。

参考:https://docs.python.org/3/library/typing.html#typing.Pattern

总结:

  • 对于Python <3.8,使用typing.re.Pattern[bytes]
  • 对于 Python 3.8,使用 typing.Pattern[bytes]
  • 对于 Python 3.9+,使用 re.Pattern[bytes]