通过 __init__ 传递 configparser.ConfigParser() 对象?
passing a configparser.ConfigParser() object via __init__?
我目前正在从事一个 dns 枚举项目,该项目向各种 API 发送请求。
其中一些 API 需要一个 API-Key,我在 config.ini 文件中提供了它。在我当前的设置中,我使用 configparser 将不同的值读入一个对象,因此我可以在需要时访问该对象。现在,当我尝试实现类似 class 结构的东西时,我想在父 class 的 init 中读入一次配置文件,所以我可以从 class.
继承每个需要 API-Key 的工具
现在的设置看起来像这样:
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, domain, 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 编程方面不如我想的那么好,我正在努力自己解决这个错误,感谢任何先进的输入。
代码看起来应该可以工作(我找不到任何错误)。
尝试检查您的配置文件,看看是否真的有这样的密钥。
但是关于代码本身,有几处我建议更改。
首先,虽然读取配置是 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 变量。给它起个不同的名字。
在从@Jakub Szlaur 那里得到输入后,我自己弄明白了:
我的文件路径指向错误的文件夹,因此从未到达 config.ini 文件。
更改后:
config.read('./config.ini')
至
config.read('$HOME/$PROJECT_PATH/config.ini')
它按预期工作。
我还根据“更好的代码风格”的评论更改了“来源”-Class:
class Source:
def __init__(self):
self.config = self.readconfig('../config.ini')
def readconfig(self, filename):
config = configparser.ConfigParser()
config.read(filename)
return config
感谢您的帮助! ;-)
我目前正在从事一个 dns 枚举项目,该项目向各种 API 发送请求。 其中一些 API 需要一个 API-Key,我在 config.ini 文件中提供了它。在我当前的设置中,我使用 configparser 将不同的值读入一个对象,因此我可以在需要时访问该对象。现在,当我尝试实现类似 class 结构的东西时,我想在父 class 的 init 中读入一次配置文件,所以我可以从 class.
继承每个需要 API-Key 的工具现在的设置看起来像这样:
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, domain, 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 编程方面不如我想的那么好,我正在努力自己解决这个错误,感谢任何先进的输入。
代码看起来应该可以工作(我找不到任何错误)。 尝试检查您的配置文件,看看是否真的有这样的密钥。
但是关于代码本身,有几处我建议更改。
首先,虽然读取配置是 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 变量。给它起个不同的名字。
在从@Jakub Szlaur 那里得到输入后,我自己弄明白了:
我的文件路径指向错误的文件夹,因此从未到达 config.ini 文件。
更改后:
config.read('./config.ini')
至
config.read('$HOME/$PROJECT_PATH/config.ini')
它按预期工作。
我还根据“更好的代码风格”的评论更改了“来源”-Class:
class Source:
def __init__(self):
self.config = self.readconfig('../config.ini')
def readconfig(self, filename):
config = configparser.ConfigParser()
config.read(filename)
return config
感谢您的帮助! ;-)