2017-12-18 1 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)) 

Diese Klasse kann die doppelten Werte für keine der 'col'-Variablen enthalten. Wenn doppelte Werte vorhanden sind, stürzt die Logik in der Klasse möglicherweise nicht ab, führt jedoch zu unvorhersehbaren Ergebnissen.Ermitteln von Duplikaten in den Variablenwerten der Klasseninstanz

Nach der Instanziierung wird meine Funktion __validate_parameters doppelte Werte erkennen und eine Exception auslösen. Das Problem ist, dass ich alle Werte in ein Wörterbuch ablege, indem ich ein neues Wörterbuch erstelle und schließlich manuell eine Ausnahme aufrufe (was von dem, was mir gesagt wurde, in jeder Situation falsch ist). Es ist auch ziemlich ausführlich.

Gibt es einen kürzeren und prägnanteren Weg, um Duplikate zu validieren, während ein Fehler ohne die obige Komplexität fortgeschrieben wird?

+0

Es ist absolut nichts falsch daran, eine Ausnahme manuell auszulösen. – zvone

Antwort

1

Sie könnten den Konstruktor veranlassen, ein Wörterbuch anstelle von einzelnen Variablen, z.

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

(-Code nicht getestet)

1

Es ist nichts falsch mit manuell eine Ausnahme zu erhöhen. Das Sammeln Ihrer Spalten in einer Sammlung erleichtert die Überprüfung:

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] 

    # ... 
Verwandte Themen