如果我编译正则表达式
>>> type(re.compile(""))
<class '_sre.SRE_Pattern'>
并希望将该正则表达式传递给函数并使用Mypy来键入check
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
无法导入。
答案 0 :(得分:11)
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
答案 1 :(得分:5)
从 Python 3.9 开始,typing.Pattern
是 deprecated。
自 3.9 版起已弃用:现在支持 [] 的类模式和匹配。请参阅 PEP 585 和通用别名类型。
您应该改用 re.Pattern
类型:
import re
def some_func(compiled_regex: re.Pattern):
...
答案 2 :(得分:2)
是的,re
模块使用的类型实际上不能通过名称访问。您需要使用typing.re
类型来代替类型注释:
import typing
def my_func(compiled_regex: typing.re.Pattern):
...