3

我正在尝试创建一个包含用户名密码等信息的配置。

我创建了一个包含以下内容的ini文件:

[DEFAULT]
username: user
password: pass

然后我有一个配置映射类,如:

导入配置解析器

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']))

运行时我收到一个错误:

TypeError:字符串索引必须是整数

我一直在关注文档,但它不起作用:https ://wiki.python.org/moin/ConfigParserExamples

或者如果有更简单的方法请告诉我

编辑:

改成这个

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

节目

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

2 回答 2

3

您在调用配置映射时出错。配置映射需要一个部分,例如“DEFAULT”。

您正在尝试发送 ('DEFAULT')['password']. 但是 ('DEFAULT') 计算为字符串,并且字符串索引只能采用整数。

试图从索引开始只是你犯的一个打字错误。

您使用 ConfigSectionMap 的方式存在问题。就像现在一样,您正在使用属性引用,这是合法的,但不是使用 config_map 的预期方式。在对 config_map 进行引用时config_map()需要两个参数,您只传递一个参数。(self, section)

您要么传递 self ,要么创建一个实例。通过调用 ConfigSectionMap(),您将获得一个实例,该实例已在 self.xml 中启动了属性。

将您的代码更改为以下代码,您看到区别了吗?

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'

您必须在 self 内部定义属性,否则它将停留在本地范围内__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

反而

于 2017-03-31T09:33:07.490 回答
3

给出另一个答案你问题的最后一部分 Or if there is an easier way please show me

OPTION1 = 'test'

保存在config.py

在代码中

import config
getattr(config, 'OPTION1', 'default value if not found')
于 2017-03-31T10:12:21.443 回答