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

时间:2016-09-15 23:44:23

标签: python mypy

如果我编译正则表达式

>>> 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无法导入。

3 个答案:

答案 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.Patterndeprecated

<块引用>

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