NoneType不可迭代

时间:2018-03-22 19:50:13

标签: python django python-3.x

我正在使用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崩溃并且不会处理文件的其余部分。

如何在不更改文件结构的情况下解决此问题

1 个答案:

答案 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 + '.'))