2017-12-18 5 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] 

    # ... 
관련 문제