微信公众号搜"智元新知"关注
微信扫一扫可直接关注哦!

通过 __init__ 传递一个 configparser.ConfigParser() 对象?

如何解决通过 __init__ 传递一个 configparser.ConfigParser() 对象?

我目前正在开发一个 dns-enumeration 项目,该项目向各种 API 发送请求。 其中一些 API 需要 API 密钥,我在 config.ini 文件中提供了该密钥。在我当前的设置中,我使用 configparser 将不同的值读入到一个对象中,因此我可以在需要时访问该对象。现在,当我尝试实现类结构之类的东西时,我想在父类init 中读入一次配置文件,这样我就可以继承每个需要 API 的工具-那个班级的钥匙。

现在的设置看起来像这样:

class Source:
    def __init__(self):
        config = configparser.ConfigParser()
        config.read('./config.ini')
        self.config = config

class BinaryEdge(Source):
    def __init__(self):
        super().__init__()

    def query(self,domain,dnsprobe):
        api_key = self.config['BINARYEDGE']['API-KEY']
        url = 'https://api.binaryedge.io/v2/query/domains/subdomain/' + domain
        fqdns = []
        ...

据我所知,如果我启动一个新的 BinaryEdge-Instance,例如这样:

if __name__ == "__main__":
    BinaryEdge = BinaryEdge()
    print(BinaryEdge.query("heise.de",False))

从技术上讲,它应该将配置文件读入一个对象并将其传递给新创建的对象,这样我就可以通过 self.config 访问它,如下所示:

 def query(self,dnsprobe):
        api_key = self.config['BINARYEDGE']['API-KEY']
        url = 'https://api.binaryedge.io/v2/query/domains/subdomain/' + domain
        fqdns = []
        ...

但是当我调试这个设置时,配置对象保持认(并且因此为空),这显然直接导致一个关键错误

File "/usr/lib64/python3.9/configparser.py",line 960,in __getitem__
    raise KeyError(key)
KeyError: 'BINARYEDGE'

由于我在 Python 编程方面不如我想的那么好,我正在努力自己解决这个错误,并感谢您提供任何先进的输入。

解决方法

从@Jakub Szlaur 获得输入后,我自己弄明白了:

我的文件路径指向错误的文件夹,因此从未访问过 config.ini 文件。

更改后:

config.read('./config.ini')

config.read('$HOME/$PROJECT_PATH/config.ini')

它按预期工作。

我还根据“更好的代码风格”的评论更改了“源”类:

class Source:
    def __init__(self):
        self.config = self.readconfig('../config.ini')
        
    def readconfig(self,filename):
        config = configparser.ConfigParser()
        config.read(filename)
        return config

感谢您的帮助! ;-)

,

代码看起来应该可以工作(我找不到任何错误)。 尝试检查您的配置文件,看看是否真的有这样的密钥。

但关于代码本身,我建议更改一些内容。

首先,虽然读取配置是 Source 初始化的一部分,但最好将其设为函数,然后调用该函数:


class Source:
    def __init__(self):
        self.config = self.readconfig("./config.ini")

    def readconfig(self,filename):
        config = configparser.ConfigParser()
        config.read(filename)
        return config

永远不要这样做:BinaryEdge = BinaryEdge()。如果您想创建另一个 BinaryEdge 实例,它将调用 BinaryEdge 变量。给它起个不同的名字。

版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。