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

问题描述 投票:0回答:2

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 mypy python-typing python-re
2个回答
4
投票

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

总结:

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

0
投票

您尝试过使用

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

我在python3.7上检查过,它可以工作

© www.soinside.com 2019 - 2024. All rights reserved.