我有一个类方法,可以通过将字典与列表进行比较来验证字典是否包含我期望它的所有键。

当前,我在类的模块级别定义了集合,如下所示:

expected_keys = {
    'key1',
    'key2',
    'key3',
    'key4',
}

class Spam(object):
    def __init__(self, config_dict):
        try:
            self.validate_configs(configs)
        except TypeError, ValueError:
            raise

        ...

    def validate_configs(self, config_dict):
        if not isinstance (config_dict, dict):
            raise TypeError('Config structure is not a dictionary.')

        if not expected_keys == config_dict.keys():
            raise ValueError('Config dict does not have all necessary keys.')


这是做到这一点的最佳方法吗?我计划一次实例化数百个这些对象,但不确定当前方法是否会导致性能下降。实际的expected_keys集也包含约30个条目。只要我做正确的事,我就可以克服它在源文件中看起来多么丑陋(“应该有一种-最好只有一种-显而易见的方式”)。

最佳答案

扩展@ PM2Ring的评论,您应该做一些事情:

1.)将expected_keys更改为set(当前为tuple。集合用{}表示)。根据@ PM2Ring的注释,您可以将其作为class attribute来保持整洁,而不是将其固定为类对象:

class Spam(object):
    expected_keys = {
        'key1',
        'key2',
        'key3',
        'key4',
    }

    def __init__(self, config_dict):
        # continue defining the rest of your class...


2.)更改您的最后一次验证:

if not expected_keys.issubset(config_dict.keys()):
    raise ValueError('Config dict does not have all necessary keys.')


这会检查config_dict是否包含您的所有expected_keys,但仍会验证config_dict是否具有与预期不同的其他键。

如果根据您的评论,config_dict必须具有与expected_keys完全相同的键(不多且不少),那么您应验证为:

if not expected_keys == config_dict.keys():
    raise ValueError('Config dict does not have all necessary keys.')

09-25 19:55