Как получить тип шаблона регулярного выражения для 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 нельзя импортировать.


person AlexLordThorsen    schedule 15.09.2016    source источник
comment
Возможный дубликат типа скомпилированного объекта регулярного выражения в python   -  person funky-future    schedule 16.05.2017
comment
Вместо этого вы можете использовать re._pattern_type.   -  person John Strood    schedule 30.11.2018


Ответы (3)


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
person metatoaster    schedule 16.09.2016

Начиная с Python 3.9 typing.Pattern устарел.

Устарело с версии 3.9: классы Pattern и Match из re теперь поддерживают []. См. PEP 585 и общий тип псевдонима.

Вместо этого вы должны использовать тип re.Pattern:

import re

def some_func(compiled_regex: re.Pattern):
    ...
person Rotareti    schedule 26.02.2021

Да, типы, которые использует модуль re, на самом деле не доступны по имени. Вместо этого вам нужно будет использовать типы typing.re для аннотаций типов. :

import typing

def my_func(compiled_regex: typing.re.Pattern):
    ...
person user2357112 supports Monica    schedule 15.09.2016
comment
Обратите внимание, что Pattern был перемещен в typing. docs.python.org/3/library/typing.html#typing. Узор - person Mateen Ulhaq; 23.01.2020