Аннотации типов и автоматическое отображение SQLAlchemy частично известной структуры базы данных - PullRequest
0 голосов
/ 29 мая 2020

Недавно мне очень понравились аннотации типа 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), что мне там использовать?

...