Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/python/359.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Python 检测类实例中的重复项';s变量值_Python_Class_Exception_Reflection_Exception Handling - Fatal编程技术网

Python 检测类实例中的重复项';s变量值

Python 检测类实例中的重复项';s变量值,python,class,exception,reflection,exception-handling,Python,Class,Exception,Reflection,Exception Handling,此类不能具有任何“col”变量的重复值。如果存在重复值,则类中的逻辑可能不会崩溃,但会产生不可预测的结果 实例化后,我的函数uu validate_参数将检测重复值并引发异常。问题是我正在将所有值转储到一个字典中,迭代创建另一个字典,最后手动引发一个异常(根据我被告知的情况,在任何情况下都是错误的)。这也相当冗长 是否有一种更简短的方法来验证重复项,同时在没有上述复杂性的情况下传播错误?您可以让构造函数使用字典而不是单个变量,例如 class Translator(object): de

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

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


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

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

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将使验证更容易:

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

手动引发异常绝对没有错。
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]

    # ...