17

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

>>> 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不可导入。

4

3 回答 3

23

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
于 2016-09-16T00:00:55.517 回答
9

Python 3.9 typing.Pattern开始已弃用

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

您应该改用该类型re.Pattern

import re

def some_func(compiled_regex: re.Pattern):
    ...
于 2021-02-26T11:33:36.527 回答
2

是的,re模块使用的类型实际上不能通过名称访问。您需要使用typing.re类型注释来代替:

import typing

def my_func(compiled_regex: typing.re.Pattern):
    ...
于 2016-09-15T23:48:31.250 回答