я могу сделать configPareserWrapper.section.keyfield для ссылки на переменную в Python? - PullRequest
0 голосов
/ 05 ноября 2019

Контекст: я использую код Python. В своем коде я использую модуль ConfigParser, для которого читать и обновлять поля можно с помощью методов, указывающих раздел и поле ключа. Теперь я работал над оболочкой для ConfigParser, где я установил __getatrr__ и __setarr__, и если переменная не является внутренней (_var), я бы использовал ConfigParser для чтения и сохранения полей (я видел другие способыразличать, является ли вызов для __getatrr__ и __setarr__ внутренним или внешним, но логика подчеркивания была для меня достаточно простой).

Вопрос: Теперь ConfigParser принимает 2 аргумента, раздел и поле ключа,Если я хочу войти с именем переменной, эти 2 части должны быть в имени переменной. Пока что я разделил раздел и ключевое поле с подчеркиванием. Но возможно ли иметь что-то вроде следующего?

configPareserWrapper.section.keyfield = 'something'
print(configPareserWrapper.section.keyfield)

Причина, я считаю, красивее. Если я попробую это, __getattr__ получит только section, кажется, что keyfield отброшено.

Ссылка на код:

from ConfigParser import SafeConfigParser
class config_wrap():
    def __init__(self):
        self._configParser = SafeConfigParser()

    def __enter__(self, conf_file='settings.ini', *args):
        self._configParser.read('./' + conf_file)
        return self

    def __getattr__(self, name):
        #all internals act as normal
        if name[0] == '_':
            return object.__getattribute__(self, name)
        else:
            section = name.split('_')[0]
            key = ''.join(name.split('_')[1:])
            return self._configParser.get(section, key)

    def __setattr__(self, name, value):
        #all internals act as normal
        if name[0] == '_':
            if name == '_dict__':
                super(self).__setattr__(name, value)
            else:
                self.__dict__[name] = value
        else:
            section = name.split('_')[0]
            key = ''.join(name.split('_')[1:])
            self._configParser.set(section, key, str(value))

спасибо

...