我正在使用Django 2.0和Python 3构建应用程序,但是我在使用自定义类解析文件时遇到了一些问题
我创建了这个类:
class MailWareConfiguration:
_configuration = {}
def __init__(self, data, *args, **kwargs):
if self._configuration == {}:
self._configuration = self.dot(data)
def accessible(self,key):
if self.exists(key) and (self._configuration[key] and not self._configuration[key] == ''):
return True
else:
return False
def dot(self, data, prepend = ''):
print('MailwareConfiguration.dot started')
results = {}
print('RAW: ' + str(data))
for key,value in data.items():
print('RAW VAL: '+str(value))
if isinstance(value, dict):
print('KEY: ' + str(key) + ' DICT: '+str(value))
results = results.update(self.dot(value,prepend+key+'.'))
else:
print('KEY: ' + str(key) + ' VALUE: '+str(value))
results[prepend+key] = value
print('RAW PROCESSED: ' + str(data))
print('MailwareConfiguration.dot finished')
return results
def exists(self, key):
if key in self._configuration:
return True
else:
return False
def get(self, key, default):
if self.accessible(key):
return self._configuration[key]
else:
return default
此类的目的是将dict
处理为平面结构dict
,其中每个后续级别将由一个点分隔,类似于config
函数在Laravel中的作用PHP。
这样做已经完成,因此我可以轻松地在.json
之外提供Git
文件的可读实现,以便诸如数据库凭据之类的敏感信息不会存储在版本控制中,但仍然具有分配给settings.py
我的示例配置文件如下所示:
{
"debug": true,
"hosts": [
"localhost"
],
"database": {
"name": "mailware",
"user": "mailware",
"password": "mailware",
"host": "localhost",
"port": "5432",
"options": {
"sslmode": "require"
}
},
"language_code": "en-us",
"time_zone": "UTC",
"api_only_mode": false,
"hostconfig": {
"salearn_bin":"/usr/bin/salearn",
"sa_bin": "/usr/bin/spamassassin",
"mailscanner_bin":"/usr/sbin/MailScanner",
"mailscanner_config_dir": "/etc/MailScanner",
"mailscanner_share_dir": "/usr/share/MailScanner",
"mailscanner_lib_dir": "/usr/lib/MailScanner",
"tmp_dir":"/tmp",
"sa_rules_dir":"/usr/share/spamassassin",
"sendmail_bin":"/usr/sbin/sendmail"
},
"retention": {
"records":60,
"audit":60,
"quarantine":60
},
"mta": "sendmail"
}
在MailWareConfiguration.dot
期间一切正常,但是一旦我们处理完database
数据的json
属性,它就会与File /Code/mailware/src/core/helpers.py", line 22, in dot
results = results.update(self.dot(value,prepend+key+'.'))
TypeError: 'NoneType' object is not iterable
崩溃并且不会处理文件的其余部分。
如何在不更改文件结构的情况下解决此问题
答案 0 :(得分:1)
重申我之前的评论:
您收到错误NoneType is not iterable
,因为您将void方法的输出 - dict.update()
- 分配给字典。 dict.update()
method引用声明:
使用其他键中的键/值对更新字典,覆盖现有键。返回
None
。
执行此操作的代码是
for key,value in data.items():
print('RAW VAL: '+str(value))
if isinstance(value, dict):
print('KEY: ' + str(key) + ' DICT: '+str(value))
---> results = results.update(self.dot(value,prepend+key+'.'))
标记的行可以简单地
results.update(self.dot(value, prepend + key + '.'))