Для ясности: этот вопрос не имеет ничего общего с самим регулярным выражением, и мой код работает отлично, хотя он не проходит строгую проверку mypy.
Давайте начнем с самого простого: у меня есть класс, определенный следующим образом:
Код: Выделить всё
from __future__ import annotations
import re
from typing import AnyStr
class MyClass:
def __init__(self, regexp: AnyStr | re.Pattern[AnyStr]) -> None:
if not isinstance(regexp, re.Pattern):
regexp = re.compile(regexp)
self._regexp: re.Pattern[str] | re.Pattern[bytes]= regexp
Я хочу, чтобы класс сохранял в частном атрибуте _regexp скомпилированное значение. Поэтому я проверяю, не предоставил ли пользователь скомпилированный шаблон, затем компилирую его и присваиваю частному атрибуту.
Пока все хорошо, хотя я ожидал, что self._regexp быть типом re.Pattern[AnyStr] вместо объединения типов шаблонов типов. В любом случае, до сих пор с mypy все в порядке.
Теперь в некоторых (или большинстве) случаев пользователь предоставляет строку регулярного выражения через файл конфигурации TOML, который считывается в , анализируемый в словаре. Для этого случая у меня есть конструктор метода класса, определенный следующим образом:
Код: Выделить всё
@classmethod
def from_dict(cls, d: dict[str, str]) -> MyClass:
r = d.get('regexp')
if r is None:
raise KeyError('missing regexp')
return cls(regexp=r)
Мне нужно проверить, что словарь содержит правильный ключ, чтобы предотвратить тип None в случае, если функция get не сможет найдите его.
Я получаю сообщение об ошибке:
ошибка: аргумент «регулярное выражение» для «MyClass» имеет несовместимый тип "ул"; ожидается "AnyStr | Pattern[AnyStr]" [arg-type]
Это выглядит странно, потому что str должна быть совместима с AnyStr, но допустим, что я измените тип словаря на dict[str, AnyStr]
Но вместо того, чтобы решить проблему, он умножает ее, потому что я получаю две ошибки:
ошибка: Аргумент «regexp» для «MyClass» имеет несовместимый тип «str»; ожидаемая ошибка «AnyStr | Pattern[AnyStr]» [arg-type]
: аргумент «regexp» для «MyClass» имеет несовместимый тип «bytes»; ожидается "AnyStr | Pattern[AnyStr]" [arg-type]
Я собираюсь сдаться. Похоже, я зациклился: когда я думаю, что что-то исправил, я просто переношу проблему в другое место.
Можете ли вы помочь мне с этой головоломкой?
Подробнее здесь: https://stackoverflow.com/questions/793 ... expression