class_desc/classes/dataclass_analyzer.md
Класс DataclassAnalyzer
Класс DataclassAnalyzer предназначен для глубокого анализа классов, помеченных как dataclass, предоставляя возможность изучать их структуру, свойства и метаданные. Он предоставляет инструменты для изучения деталей полей, включая аннотации, значения по умолчанию и метаданные, что полезно для диагностики и рефакторинга.
Основная информация
- Имя файла: anb_python_components\classes\dataclass_analyzer.py
- Автор: Александр Бабаев
- Версия: 1.0.0
- Дата начала поддержки: с версии 1.4.0
Атрибуты и методы класса
Статический метод analyze_properties
Анализирует отдельное свойство класса, возвращая подробную информацию о нём, включая метаданные.
Параметры:
cls: класс (должен быть объявлен какdataclass).prop_name: имя анализируемого свойства.
Возвращает:
- Словарь с информацией о метаданных поля.
Пример использования:
from dataclasses import dataclass
from anb_python_components import DataClassExtension, DataclassAnalyzer
class Fields:
@staticmethod
def primary_key (default = None):
return DataClassExtension.define(default, metadata = {'db_primary_key': True})
@staticmethod
def unique (default = None):
return DataClassExtension.define(default, metadata = {'db_unique': True})
@staticmethod
def indexed (default = None):
return DataClassExtension.define(default, metadata = {'db_indexed': True})
@staticmethod
def compose (default, *fields):
return DataClassExtension.defines(default, *fields)
@dataclass
class A:
a: int = Fields.primary_key(0)
b: str = Fields.compose("", Fields.unique(), Fields.indexed())
analysis_a = DataclassAnalyzer.analyze_properties(A, "a")
analysis_b = DataclassAnalyzer.analyze_properties(A, "b")
print(analysis_a) # {'db_primary_key': True}
print(analysis_b) # {'db_unique': True, 'db_indexed': True}
Статический метод analyze_class
Анализирует весь класс целиком, собирая информацию обо всех полях и классовых метаданных.
Параметры:
cls: класс (должен быть объявлен какdataclass).
Возвращает:
- Словарь с полной информацией о структуре класса и его полях.
Пример использования:
from dataclasses import dataclass, is_dataclass
from anb_python_components import DataClassExtension, DataclassAnalyzer
class Fields:
@staticmethod
def primary_key (default = None):
return DataClassExtension.define(default, metadata = {'db_primary_key': True})
@staticmethod
def unique (default = None):
return DataClassExtension.define(default, metadata = {'db_unique': True})
@staticmethod
def indexed (default = None):
return DataClassExtension.define(default, metadata = {'db_indexed': True})
@staticmethod
def compose (default, *fields):
return DataClassExtension.defines(default, *fields)
def table_name (name: str):
"""
Декоратор для dataclass-класса, задающий имя таблицы в СУБД.
:param name: Имя таблицы.
:return: Обогащённый класс.
"""
def decorator (cls):
if not is_dataclass(cls):
raise TypeError(f"Класс {cls.__name__} должен быть dataclass")
# Сохраняем имя таблицы как атрибут класса (начинается с __meta_)
cls.__meta_table_name = name
return cls
return decorator
@table_name("ANB")
@dataclass
class A:
a: int = Fields.primary_key(0)
b: str = Fields.compose("", Fields.unique(), Fields.indexed())
analyze = DataclassAnalyzer.analyze_class(A)
print(
analyze
) # {'__CLASS__': {'table_name': 'ANB'}, 'a': {'db_primary_key': True}, 'b': {'db_unique': True, 'db_indexed': True}}
Заключение
Класс DataclassAnalyzer полезен для разработчиков, желающих глубже изучить внутреннее устройство классов, объявленных как dataclass, и проанализировать их свойства и метаданные. Он облегчает процессы рефакторинга, тестирования и сопровождения кода.