Как обеспечить согласованность имен полей/атрибутов/столбцов данных во всем проекте?
В любом проекте на Python или другом языке нам необходимо использовать одинаковые имена полей в разных местах на протяжении всего конвейера обработки проекта. Такое требование вездесуще и часто приводит к ошибкам, времени на отладку и разрушению кода во время выполнения. Итак, как мы можем обеспечить согласованность имен полей/атрибутов/столбцов на протяжении всего проекта. (чтобы избежать опечаток, несовпадения имен и т. д.) Давайте разберем проблему на примере:
Предположим, мой проект предполагает использование соскабливания данных для их сбора, а затем их хранение и предоставление через внутреннюю инфраструктуру (веб-приложение или API).
Теперь, если я использую Scrapy для скраппинга данных, я должен создать Item() с необходимыми полями данных (например: book_title, author, pages и price), в дальнейшем эти же имена полей должны использоваться в пауках для скраппинга данных, которые могут быть сохранены как JSON .
Json файл может быть сброшен в базу данных напрямую (для заполнения данных для приложения), тогда в базе данных необходимо создать таблицу/ы, возможно, с теми же именами, чтобы избежать ошибок.
Аналогично, если в качестве бэкенда используется Django, то модель и сериализатор также будут иметь имена этих полей, поэтому снова нужно повторить те же имена полей.
если мы хотим сделать какую-то операцию с данными, предположим с 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"]
Это также даст подсказки и автозавершение в большинстве редакторов.