Определить список на уровне модуля или в классе - PullRequest
0 голосов
/ 04 октября 2018

У меня есть метод класса, который проверяет, что словарь содержит все ключи, которые я ожидаю, сравнивая словарь со списком.

В настоящее время у меня есть набор, определенный на уровне модуля моегокласс, вот так:

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 записей.Я могу понять, как уродливо это выглядит в моем исходном файле, если я все делаю правильно («должен быть один - и желательно только один - очевидный способ сделать это»).

1 Ответ

0 голосов
/ 04 октября 2018

Расширяя комментарий @ 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.')
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...