如何获得 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.Patterndeprecated.

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):
    ...