2017-12-18 25 views
1
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は重複した値を検出し、例外を発生させます。問題は、すべての値を辞書にダンプして別の辞書を作成し、最後に手作業で例外を発生させることです(どのような状況で行っても間違っていると言われています)。かなり冗長です。

上記の複雑さを排除してエラーを伝える一方で、重複を検証するための簡潔で簡潔な方法はありますか?

+0

例外を手作業で発生させることは間違いありません。 – zvone

答えて

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

(コードテストしていません)

1

手動で例外を発生させることは何も問題はありません。いくつかのコレクションでコレクションを収集すると、検証がより簡単になります。

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] 

    # ... 
関連する問題