专门化正则表达式类型 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.Pattern
和 re.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]
将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.Pattern
和 re.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]