Класс данных, вызываемый при импорте (?) - PullRequest
1 голос
/ 21 октября 2019

Я определил этот класс данных:

import logging
from config.config_parser import ConfigParser
from dataclasses import dataclass

@dataclass
class A:
    id_execution: int
    flag: bool
    log: str = logging.getLogger('log_handler')
    con: str = ConfigParser.get_conf('A', 'a_value')
    name: str = None
    surname: str = None

Этот класс данных вызывается в другом «традиционном» классе, например:

from handlers.handler_a import A
from config.config_parser import ConfigParser

# Configuration initialization
ConfigParser.initialize_config()

# Instantiate A dataclass
a = A()

Сбой ConfigParser, поскольку он не инициализирован. Похоже, что A импортируется в вышеупомянутом импорте до configParser и всего.

Как это возможно? Я что-то не так делаю?

Заранее спасибо

Ответы [ 2 ]

0 голосов
/ 21 октября 2019

ConfigParser.get_conf('A', 'a_value') вызывается при создании A, поэтому он терпит неудачу. В обычном классе это будет написано

class A:
    def __init__(self):
        self.con = ConfigParser.get_conf('A', 'a_value')

, а get_conf будет вызываться только при создании экземпляра.

Мы можем сказать классу данных сделать то же самое, сделавс этим атрибутом field с default_factory:

ведение журнала импорта из config.config_parser import ConfigParser из классов данных import dataclass, поле

@dataclass
class A:
    id_execution: int
    flag: bool
    log: str = logging.getLogger('log_handler')
    con: str = field(default_factory=lambda: ConfigParser.get_conf('A', 'a_value'))
    name: str = None
    surname: str = None
0 голосов
/ 21 октября 2019

A не инициализируется при импорте, но тогда присваиваются все эти переменные класса A, и поэтому выполняется правая часть присваивания, например ConfigParser.get_conf('A', 'a_value').

Если вы создаете эти переменные на уровне экземплярапеременные (поместив их объявление в __init__), они будут назначены при вызове этого a = A().

...