【问题标题】:Detecting Duplicates in Class Instance's Variable Values检测类实例变量值中的重复项
【发布时间】:2023-03-03 00:22:01
【问题描述】:
class Translator(object):
    def __init__(self, tracking_col='tracking_id', coding_col='coding', qualifying_code_col='qualifying_code',
                 translation_col='translation'):
        self._results = []
        self.tracking_col = tracking_col
        self.data_col = coding_col
        self.definition_col = qualifying_code_col
        self.translation_col = translation_col
        self.__validate_parameters(self.__dict__)

    def __validate_parameters(self, variable_values):
        class_values = {}
        for key, value in variable_values.items():
            if type(value) is str:
                class_values.setdefault(value, set()).add(key)
        for key, values in class_values.items():
            # If there is more than one value, there is a duplicate
            if len(values) > 1:
                raise Exception('Duplicate column names exist in parameters. \'{}\' are set to \'{}\'. '
                                'Do not use duplicate column names.'.format(values, key))

此类不能有任何“col”变量的重复值。如果存在重复值,类中进一步的逻辑可能不会崩溃,但会产生不可预知的结果。

在实例化时,我的函数 __validate_parameters 将检测重复值并引发异常。问题是我将所有值转储到字典中,迭代以创建另一个字典,最后手动引发异常(据我所知,在任何情况下这样做都是错误的)。它也相当冗长。

是否有一种更短更简洁的方法来验证重复项,同时向上传播错误而没有上述复杂性?

【问题讨论】:

  • 手动引发异常绝对没有错。

标签: python class exception reflection exception-handling


【解决方案1】:

您可以让构造函数采用字典而不是单个变量,例如

class Translator(object):
  def __init__(self, cols={}):
    defaults = { "tracking_col"        : "tracking_id", 
                 "coding_col"          : "coding",
                 "qualifying_code_col" : "qualifying_code", 
                 "translation_col"     : "translation" }

    for d in defaults:
      if d not in cols:
        cols[d] = defaults[d]

    self.__validate_parameters(cols)

  def __validate_parameters(self, d):
    import Counter
    c = Counter.Counter(d.values())
    if any(cnt > 1 for cnt in c.values()):
      raise Exception("Duplicate values found: '%s'" % str(c))

(代码未测试)

【讨论】:

    【解决方案2】:

    手动引发异常并没有错。在某些集合中收集您的 cols 将使验证更容易:

    class Translator(object):
        def __init__(self, tracking_col=..., coding_col=..., qualifying_code_col=..., 
                     translation_col=...):
            self._results = []
            self.cols = [tracking_col, coding_col, qualifying_code_col, translation_col]
            self.validate_cols(self)
    
        def validate_cols(self):
            if len(self.cols) > len(set(self.cols)):
                raise ...
    
        @property
        def tracking_col(self):
            return cols[0]
    
        # ...
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2021-05-16
      • 1970-01-01
      • 1970-01-01
      • 2012-08-27
      • 1970-01-01
      • 1970-01-01
      • 2016-12-24
      • 1970-01-01
      相关资源
      最近更新 更多