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, и проанализировать их свойства и метаданные. Он облегчает процессы рефакторинга, тестирования и сопровождения кода.

На главную