如何获得 MyPy 的正则表达式模式类型
How do I get a regex pattern type for MyPy
如果我编译正则表达式
>>> type(re.compile(""))
<class '_sre.SRE_Pattern'>
并想将该正则表达式传递给函数并使用 Mypy 进行类型检查
def my_func(compiled_regex: _sre.SRE_Pattern):
我运行遇到这个问题
>>> import _sre
>>> from _sre import SRE_Pattern
Traceback (most recent call last):
File "<stdin>", line 1, in <module>
ImportError: cannot import name 'SRE_Pattern'
您似乎可以导入 _sre
,但由于某些原因 SRE_Pattern
无法导入。
是的,re
模块使用的类型实际上无法通过名称访问。您需要使用 typing.re
类型来代替类型注释:
import typing
def my_func(compiled_regex: typing.re.Pattern):
...
mypy
对它可以接受的内容非常严格,所以你不能只生成类型或使用它不知道如何支持的导入位置(否则它只会抱怨库存根用于它不理解的标准库导入的语法)。完整解决方案:
import re
from typing import Pattern
def my_func(compiled_regex: Pattern):
return compiled_regex.flags
patt = re.compile('')
print(my_func(patt))
示例运行:
$ mypy foo.py
$ python foo.py
32
从开始Python 3.9 typing.Pattern
是deprecated.
Deprecated since version 3.9: Classes Pattern and Match from re now support []. See PEP 585 and Generic Alias Type.
您应该改用 re.Pattern
类型:
import re
def some_func(compiled_regex: re.Pattern):
...
如果我编译正则表达式
>>> type(re.compile(""))
<class '_sre.SRE_Pattern'>
并想将该正则表达式传递给函数并使用 Mypy 进行类型检查
def my_func(compiled_regex: _sre.SRE_Pattern):
我运行遇到这个问题
>>> import _sre
>>> from _sre import SRE_Pattern
Traceback (most recent call last):
File "<stdin>", line 1, in <module>
ImportError: cannot import name 'SRE_Pattern'
您似乎可以导入 _sre
,但由于某些原因 SRE_Pattern
无法导入。
是的,re
模块使用的类型实际上无法通过名称访问。您需要使用 typing.re
类型来代替类型注释:
import typing
def my_func(compiled_regex: typing.re.Pattern):
...
mypy
对它可以接受的内容非常严格,所以你不能只生成类型或使用它不知道如何支持的导入位置(否则它只会抱怨库存根用于它不理解的标准库导入的语法)。完整解决方案:
import re
from typing import Pattern
def my_func(compiled_regex: Pattern):
return compiled_regex.flags
patt = re.compile('')
print(my_func(patt))
示例运行:
$ mypy foo.py
$ python foo.py
32
从开始Python 3.9 typing.Pattern
是deprecated.
Deprecated since version 3.9: Classes Pattern and Match from re now support []. See PEP 585 and Generic Alias Type.
您应该改用 re.Pattern
类型:
import re
def some_func(compiled_regex: re.Pattern):
...