Давайте начнем с Basic, у меня есть класс, определенный следующим образом:
Код: Выделить всё
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)
Мне нужно проверить, что словарь содержит правильный ключ, чтобы предотвратить NoneType в случае, если функция get не сможет найти это.
Я получаю сообщение об ошибке:
ошибка: аргумент «регулярное выражение» для «MyClass» имеет несовместимый тип " ул"; ожидается "AnyStr | Pattern[AnyStr]" [arg-type]
Это выглядит странно, поскольку строка должна быть совместима с 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 ... r-expected