Python 如何为MyPy获取正则表达式模式类型

Python 如何为MyPy获取正则表达式模式类型,python,mypy,Python,Mypy,如果我编译一个正则表达式 >>> type(re.compile("")) <class '_sre.SRE_Pattern'> 我遇到了这个问题 >>> import _sre >>> from _sre import SRE_Pattern Traceback (most recent call last): File "<stdin>", line 1, in <module> ImportEr

如果我编译一个正则表达式

>>> type(re.compile(""))
<class '_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模式 回溯(最近一次呼叫最后一次): 文件“”,第1行,在 ImportError:无法导入名称“SRE_模式”
似乎您可以导入
\u sre
,但由于某些原因,
sre\u模式
不可导入。

是的,
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

从Python3.9开始键入。模式是

自3.9版以来已弃用:现在重新支持[]的类模式和匹配。请参阅PEP 585和通用别名类型

您应该使用类型
re.Pattern

重新导入
def some_func(编译的正则表达式:re.Pattern):
...

您可以使用
re.\u pattern\u type
代替可能的重复。请注意,
pattern
已移动到
typing
$ mypy foo.py 
$ python foo.py 
32