收集所有关键错误

Collect all key errors

我想创建一个 class 来存储 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}")

这是我的方法,但行不通。以下代码将仅打印出现的第一个关键错误。 我也可以说它看起来不太好,因为我需要写两次相同的异常。

你能告诉我如何创建这个功能吗?

您可以实现自己的字典:

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 的缺失列表。像这样使用:

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']

我已经修改了您的代码以遍历您要检查的每个键:

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')]

您确定要存储异常消息吗?因为看起来你只是想知道字典中缺少哪些键。如果是这种情况,您应该查看 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() 方法,如果密钥不存在,则 returns None。如果失败,您可以设置默认值 return,例如 dictionary.get(something, "return this if not found")。但是,这将排除字典中但值为 None 的键。

return [k for k in keys_to_look_for if not some_dict.get(k)]