Соберите все ключевые ошибки - PullRequest
0 голосов
/ 21 февраля 2020

Я хочу создать класс, который будет хранить список ключевых ошибок, произошедших в init .

class Basic:
    missing_view_data_columns = []

    def __init__(self, some_dict):
        self.some_dict = some_dict
        try:
            self.basic_1 = self.some_dict['basic_1']
            self.basic_2 = self.some_dict['basic_2']

        except KeyError as e:
            self.add_missing_data_column(e)

    @classmethod
    def add_missing_data_column(cls, column_name):
        cls.missing_view_data_columns.append(column_name)


class Specific(Basic):

    def __init__(self, some_dict):
        super().__init__(some_dict)
        try:
            self.specific_1 = self.some_dict['specific_1']
            self.specific_2 = self.some_dict['specific_2']

        except KeyError as e:
            self.add_missing_data_column(e)


rem = Specific({})

print(f"missing_keys: {rem.missing_view_data_columns}")

Это мой подход, но он не работает. Следующий код напечатает только первую появившуюся ошибку ключа. Также я могу сказать, что это выглядит не слишком хорошо, потому что мне нужно написать одно и то же исключение дважды.

Не могли бы вы дать мне совет, как создать эту функцию?

Ответы [ 4 ]

1 голос
/ 21 февраля 2020

Я изменил ваш код на l oop для каждого ключа, который вы хотите проверить:

class Basic:
    missing_view_data_columns = []

    def __init__(self, some_dict):
        self.some_dict = some_dict
        keys = ['basic_1', 'basic_2']
        for key in keys:
            self.check_for_key_error(key)

    def check_for_key_error(self, key):
        try:
            self.key = self.some_dict[key]
        except KeyError as e:
            self.add_missing_data_column(e)

    @classmethod
    def add_missing_data_column(cls, column_name):
        cls.missing_view_data_columns.append(column_name)


class Specific(Basic):

    def __init__(self, some_dict):
        super().__init__(some_dict)
        keys = ['basic_1', 'basic_2']
        for key in keys:
            self.check_for_key_error(key)


rem = Specific({})

print(f"missing_keys: {rem.missing_view_data_columns}")

Вывод:

missing_keys: [KeyError('basic_1'), KeyError('basic_2'), KeyError('basic_1'), KeyError('basic_2')]

1 голос
/ 21 февраля 2020

Вы действительно хотите хранить сообщения об исключениях? Потому что, похоже, вы просто хотите узнать, какие ключи отсутствуют в словаре. Если это так, вы должны просто посмотреть в dictionary.keys ().

keys_to_look_for = ["key_1", "key_2", "key_n"]
return [k for k in keys_to_look_for if k not in some_dict.keys()]

Вы также можете использовать метод dictionary.get(), который возвращает None, если ключ отсутствует. Вы можете установить возвращаемое значение по умолчанию в случае сбоя, например dictionary.get(something, "return this if not found"). Однако это исключило бы ключи, которые есть в словаре, но значение которых равно None.

return [k for k in keys_to_look_for if not some_dict.get(k)]
1 голос
/ 21 февраля 2020

Вы можете реализовать свой собственный словарь:

from collections.abc import Mapping

class MissingDict(Mapping):
    def __init__(self, d, cls):
      self._d = d
      self.cls = cls

    def __getitem__(self, i):
      if i in self._d:
          return self._d[i]

      self.cls.add_missing_data_column(i)

    def __iter__(self): return iter(self._d)
    def __len__(self):  return len(self._d.keys())

Это сохранит экземпляр словаря и обновит отсутствующий список вашего класса всякий раз, когда вы пытаетесь получить доступ к новому ключу. Используйте как это:

class Basic:
    missing_view_data_columns = []

    def __init__(self, some_dict):
        self.some_dict = MissingDict(some_dict, self)
        self.basic_1 = self.some_dict['basic_1']
        self.basic_2 = self.some_dict['basic_2']

    @classmethod
    def add_missing_data_column(cls, column_name):
        cls.missing_view_data_columns.append(column_name)


class Specific(Basic):

    def __init__(self, some_dict):
        super().__init__(some_dict)
        self.specific_1 = self.some_dict['specific_1']
        self.specific_2 = self.some_dict['specific_2']


rem = Specific({})

print(f"missing_keys: {rem.missing_view_data_columns}")

Отображение:

missing_keys: ['basic_1', 'basic_2', 'specific_1', 'specific_2']
0 голосов
/ 21 февраля 2020

Вы можете решить проблему без использования блока try/except: вот код для этого:

class Basic:
    missing_view_data_columns = []

    def __init__(self, some_dict):
        self.some_dict = some_dict

        self.basic_1 = self.some_dict.get('basic_1') or self.add_missing_data_column(KeyError('basic_1'))
        self.basic_2 = self.some_dict.get('basic_1') or self.add_missing_data_column(KeyError('basic_2'))

    @classmethod
    def add_missing_data_column(cls, column_name):
        cls.missing_view_data_columns.append(column_name)


class Specific(Basic):
    def __init__(self, some_dict):
        super().__init__(some_dict)

        self.specific_1 = self.some_dict.get('specific_1') or self.add_missing_data_column(KeyError('specific_1'))
        self.specific_2 = self.some_dict.get('specific_2') or self.add_missing_data_column(KeyError('specific_2'))


rem = Specific({ "specific_1": 1})

print(f"missing_keys: {rem.missing_view_data_columns}")

Надеюсь, это поможет!

...