将
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?
Python 3.9 中添加了使用
re.Pattern
或 re.Match
专门化通用 [str]
和 [bytes]
类型的功能。您似乎使用的是较旧的 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
总结:
typing.re.Pattern[bytes]
typing.Pattern[bytes]
re.Pattern[bytes]
您尝试过使用
typing
模块吗?我认为这里出现问题是因为 re.Pattern[bytes]
表达式不能像你想要的那样使用。
尝试类似typing.re.Pattern[bytes]
。