Статическая типизация регулярного выражения PythonPython

Программы на Python
Ответить Пред. темаСлед. тема
Anonymous
 Статическая типизация регулярного выражения Python

Сообщение Anonymous »

У меня проблема со статической типизацией регулярного выражения Python.
Для ясности: этот вопрос не имеет ничего общего с самим регулярным выражением, и мой код работает отлично, хотя он не проходит строгую проверку 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
Пользователь может создать класс, передав скомпилированный шаблон re или AnyStr.
Я хочу, чтобы класс сохранял в частном атрибуте _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)
Тип словаря будет dict[str, str].
Мне нужно проверить, что словарь содержит правильный ключ, чтобы предотвратить тип 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
Реклама
Ответить Пред. темаСлед. тема

Быстрый ответ

Изменение регистра текста: 
Смайлики
:) :( :oops: :roll: :wink: :muza: :clever: :sorry: :angel: :read: *x)
Ещё смайлики…
   
К этому ответу прикреплено по крайней мере одно вложение.

Если вы не хотите добавлять вложения, оставьте поля пустыми.

Максимально разрешённый размер вложения: 15 МБ.

  • Похожие темы
    Ответы
    Просмотры
    Последнее сообщение

Вернуться в «Python»