Недавно мне очень понравились аннотации типа python и я тестировал их с помощью mypy
. В моем текущем проекте я работаю с базой данных с частично известной структурой. Например, я знаю, что в базе данных есть таблица с именем FormTable
со столбцом внешнего ключа с именем languageReference
, указывающим на таблицу с именем LanguageTable
, первичный ключ которой находится в столбце с именем id
, но каждый из них Таблица может иметь еще несколько столбцов в зависимости от потребностей пользователя. Одна из функций, которые мне нужно реализовать, - это преобразование в Excel для просмотра структурно четко определенной части базы данных.
Как я могу извлечь как можно больше из системы аннотаций типов Python, чтобы предотвратить ошибки программирования в дальнейшем?
Думаю, я мог бы определить их как typing.Protocol
s, а затем я мог бы сделать что-то вроде
import typing
import openpyxl
import sqlalchemy.ext.automap
class Language(typing.Protocol):
id: str
L = typing.TypeVar("L", bound=Language)
class Form(typing.Protocol, typing.Generic[L]):
def __init__(self, language: typing.Optional[L], **kwargs):
...
language: L
class Translator():
def __init__(self, database: sqlalchemy.engine.Engine):
Base = sqlalchemy.ext.automap.automap_base()
Base.prepare(database, reflect=True)
self.Language: typing.Type[Language] = Base.classes.LanguageTable
self.Form: typing.Type[Form[self.Language]] = Base.classes.FormTable
def form_from_excel_cell(self, cell: openpyxl.cell.Cell) -> Form:
return self.Form(...)
Это разумный подход в принципе? В настоящее время, как здесь написано, аргумент типа self.Language
не определен с точки зрения mypy
(experiment.py:21: error: Name 'self.Language' is not defined
), что мне там использовать?