Как обеспечить согласованность имен полей/атрибутов/столбцов данных во всем проекте?

В любом проекте на Python или другом языке нам необходимо использовать одинаковые имена полей в разных местах на протяжении всего конвейера обработки проекта. Такое требование вездесуще и часто приводит к ошибкам, времени на отладку и разрушению кода во время выполнения. Итак, как мы можем обеспечить согласованность имен полей/атрибутов/столбцов на протяжении всего проекта. (чтобы избежать опечаток, несовпадения имен и т. д.) Давайте разберем проблему на примере:

Предположим, мой проект предполагает использование соскабливания данных для их сбора, а затем их хранение и предоставление через внутреннюю инфраструктуру (веб-приложение или API).

  1. Теперь, если я использую Scrapy для скраппинга данных, я должен создать Item() с необходимыми полями данных (например: book_title, author, pages и price), в дальнейшем эти же имена полей должны использоваться в пауках для скраппинга данных, которые могут быть сохранены как JSON .

  2. Json файл может быть сброшен в базу данных напрямую (для заполнения данных для приложения), тогда в базе данных необходимо создать таблицу/ы, возможно, с теми же именами, чтобы избежать ошибок.

  3. Аналогично, если в качестве бэкенда используется Django, то модель и сериализатор также будут иметь имена этих полей, поэтому снова нужно повторить те же имена полей.

  4. если мы хотим сделать какую-то операцию с данными, предположим с pandas, то мы можем либо импортировать JSON, либо создать dataframe вручную (повторяя имена полей).

Мы видим, что в одном проекте нам нужно несколько раз повторить название полей. Вариации в названии могут привести или не привести к ошибкам или проблемам. Тем не менее, быть последовательным в именах - это хорошо и безопасно в больших проектах.

Итак, каковы наилучшие возможные пути достижения этого? Когда я начал работать над этим, появилось много модулей python, но большинство из них тяжелые и предлагают много функций, которые либо поддерживаются в отдельных пакетах/фреймворках, а интеграция их с внешними пакетами создает конфликты и ненужную нагрузку на проект.

Мне нужна очень простая вещь, например, просто текстовый файл и т.д. Примечание: Я не прошу никаких подсказок типа или проверки данных и т.д. Просто хочу иметь последовательное имя поля. Например, имя_студента, имя, имя_студента, должно быть просто любым во всем проекте.

Я перепробовал множество пакетов, предлагающих возможности создания моделей данных на основе классов. Например, Pydantic, Itemloader, marshmallow, attrib и т.д.

Например, следующий код дает возможность использовать имя поля, которое может быть использовано в другой части проекта, но это выглядит как перебор с использованием Pydantic только для получения имени поля:

from pydantic import BaseModel
from typing import List, Optional

class NoteSchema(BaseModel):
    title: str
    content: str
    tags: List[str]
    user_id: int
    created_at: Optional[str] = None

# Get the list of field names from the Pydantic model
field_names = list(NoteSchema.model_fields.keys())


print(field_names)

Я бы использовал класс StrEnum для определения имен полей/атрибутов/столбцов в одном месте. Я просто добавил небольшой метод класса, чтобы получить поля в виде списка.

from enum import StrEnum

class NoteSchema(StrEnum):

    TITLE = "title"
    CONTENT = "content"
    TAGS = "tags"

    @classmethod
    def list(cls):
        return list(map(lambda c: c.value, cls))

В местах, где вам нужно использовать эти поля, например, в pandas, вы можете сделать следующее:

import pandas as pd
from dataschema import NoteSchema

df = pd.DataFrame(columns=NoteSchema.list())

df[NoteSchema.CONTENT] = [1, 2, 3]
df[NoteSchema.TITLE] = ["titleA", "titleB", "titleC"]

Это также даст подсказки и автозавершение в большинстве редакторов.

Вернуться на верх