Получение внутреннего состояния @classmethod в Python - PullRequest
0 голосов
/ 12 мая 2018

Я использую библиотеку, внутри которой определена следующая функция:

@classmethod
def from_file(cls, path):

    try:
        with open(path) as config_file:
            content = yaml.safe_load(config_file)
    except IOError:
        log.error(u"Can't open configuration file '%s'" % path)
        raise ConfigurationError

    return cls(content)

, который я вызываю следующим образом из моего собственного класса:

class MyConfig(object):

    def __init__(self, custom_base_path=None, mappings_file_name=None):

    ....
            self.__cfg = self.__load_mappings_file(file=mappings_file_name)

    ....

def __load_mappings_file(self, file=None):

      ....

    return AttrHolder.from_file(filename)

AttrHolder класс определен в том же модуле:

class AttrHolder(Config):
            schema = {
                "subject": {
                    "email": StringEntry,
                    "name": StringEntry
                    },
                "entitlements": {
                    "containerName": StringEntry(required=True)
                    },
            }

Вот код для стороннего Config's __init__:

def __init__(self, content, _schema=None):
    if _schema:
        self.schema = _schema

    if self.schema and (not content or not isinstance(content, dict)):
        log.error(u"Invalid configuration")
        raise ConfigurationError

    self.entries = {}
    self.children = set()

    for key, value in self.schema.items():
        if isinstance(value, dict):
            setattr(self, key, Config(content.get(key), _schema=value))
            self.children.add(key)
        elif isinstance(value, ConfigEntry):
            self.parse_entry(key, value, (content or {}).get(key))
        else:
            log.warning(u"Invalid entry in configuration content: %s" % key)

Мне интересно, как я могу овладеть полем content в этой первой строфе, чтобы использовать его в моем классе Config? Причина, по которой мне нужно это сделать, заключается в том, что я обнаружил (с помощью отладки), что вызов AttrHolder.from_file() возвращает искаженное представление структуры, которая была ему передана. Я хотел бы сохранить исходное представление, которое, по-видимому, доступно в поле content.

Спасибо.

1 Ответ

0 голосов
/ 12 мая 2018

Просто используйте вместо этого собственный подкласс AttrHolder:

class MyAttrHolder(AttrHolder):
    def __init__(self, content, _schema=None):
        do_things_with(content)
        super(MyAttrHolder, self).__init__(content, _schema)

...

MyAttrHolder.from_file(filename)

Тогда внутри from_file, cls будет MyAttrHolder.В этом смысл classmethod.

...