Создайте файл конфигурации для хранения значений, таких как URL-адрес имени пользователя в Python.

Я пытаюсь создать конфигурацию, которая содержит такую ​​информацию, как имя пользователя, пароль и т. Д.

Я создал INI-файл, содержащий это:

[DEFAULT]
username: user
password: pass

Затем у меня есть класс карты конфигурации, например:

импортировать configparser

class ConfigSectionMap:
    def __init__(self):
        my_config_parser = configparser.ConfigParser()
        my_config_parser.read('inilocation')
        print(my_config_parser.default_section)

    def config_map(self, section):
        dict1 = {}
        options = self.my_config_parser.options(section)
        for option in options:
            try:
                dict1[option] = self.my_config_parser.get(section, option)
                if dict1[option] == -1:
                    print("skip: %s" % option)
            except:
                print("exception on %s!" % option)
                dict1[option] = None
        return dict1

В моем основном классе, где я хочу использовать это, я делаю:

from config_section_map import ConfigSectionMap

print(ConfigSectionMap.config_map(("DEFAULT")['password']))

при запуске этого я получаю сообщение об ошибке:

Ошибка типа: строковые индексы должны быть целыми числами

Я следил за документами, но это не работает: https://wiki.python.org/moin/ConfigParserExamples

Или, если есть более простой способ, пожалуйста, покажи мне

редактировать:

меняется на это

print(ConfigSectionMap.config_map("DEFAULT")['password']) 

шоу

TypeError: config_map() missing 1 required positional argument: 'section'

2 ответа

Решение

Чтобы дать еще один ответ на последнюю часть вашего вопросаOr if there is an easier way please show me

OPTION1 = 'test'

сохранить в config.py

в коде

import config
getattr(config, 'OPTION1', 'default value if not found')

Вы сделали ошибку, вызывая карту конфигурации. Конфиг карта занимает раздел, как "DEFAULT".

Вы пытаетесь отправить ("ПО УМОЛЧАНИЮ") ["пароль"]. Но ('DEFAULT') вычисляется как строка, а строковые индексы могут принимать только целые числа.

Попытка сначала взять индекс - это просто ошибка, которую вы допустили.

Существует проблема с тем, как вы работаете с ConfigSectionMap. Как и сейчас, вы работаете с атрибутами атрибутов, что является законным, но не ожидаемым способом работы с config_map. config_map() ожидает два аргумента (self, section) при ссылке на config_map вы передаете только один аргумент.

Вы либо передаете себя, либо делаете пример. Вызвав ConfigSectionMap(), вы получите экземпляр, который инициировал атрибуты внутри себя.

Вместо этого измените свой код на следующий, видите ли вы разницу?

from config_section_map import ConfigSectionMap

conf_object = ConfigSectionMap()

print(conf_object.config_map("DEFAULT")['password'])

['password'] теперь применяется к возвращенному результату из config_map вместо аргумента к нему.

Решить проблему options = self.my_config_parser.options(section) AttributeError: 'ConfigSectionMap' object has no attribute 'my_config_parser'

Вы должны определить атрибуты внутри себя, иначе он останется в этой локальной области видимости. __init__

class ConfigSectionMap:
    def __init__(self):
        self.my_config_parser = configparser.ConfigParser()
        self.my_config_parser.read('inilocation')
        print(self.my_config_parser.default_section)

    def config_map(self, section):
        dict1 = {}
        options = self.my_config_parser.options(section)
        for option in options:
            try:
                dict1[option] = self.my_config_parser.get(section, option)
                if dict1[option] == -1:
                    print("skip: %s" % option)
            except:
                print("exception on %s!" % option)
                dict1[option] = None
        return dict1

Как отмечается в комментарии @officialaimm, может быть проблема с названием раздела DEFAULT попробуй изменить конфиг на

[SomeThingElse]
username: user
password: pass

вместо

Другие вопросы по тегам