2016-08-30 4 views
1

그래서 파이썬 사전을 추가하고 업데이트하고 있습니다. 현재보기에는보기가 어렵고 읽기가 어렵습니다. 같은 것을하기에 더 좋은 방법이 있습니까?파이썬 사전 값 업데이트

 if not transaction_id in self.transaction_log: 
      self.transaction_log[transaction_id] = { 
       'gross_total': 0, 
       'net_total': 0, 
       'qty_total': 0, 
       'tax_total': 0 
      } 
      self.transaction_log[transaction_id]['products'] = {} 


     # create a list of dics to be reused in 
     # other class methods 
     self.transaction_log[transaction_id].update({ 
      'transaction_id': transaction_id, 
      'transaction_time': transaction_datetime, 
      'location_id': location_id, 
      'till_id': till_id, 
      'employee_id': employee_id, 

     }) 

     self.transaction_log[transaction_id]['products'][product_id] = { 
      'gross': gross, 
      'net': net, 
      'tax': tax, 
      'qty': qty 
     } 

     self.transaction_log[transaction_id]['gross_total'] += gross 
     self.transaction_log[transaction_id]['net_total'] += net 
     self.transaction_log[transaction_id]['qty_total'] += tax 
     self.transaction_log[transaction_id]['tax_total'] += qty 
+1

tax 우리가이 코드에 대한 좀 더 컨텍스트가 없습니다 반전처럼 보인다? 이미 작동하는 코드를 단순히 리팩토링하는 것은 대개 http://codereview.stackexchange.com에서 처리됩니다. –

+1

두 가지 사항은 스 니펫 시작 부분에서'self.transaction_log [transaction_id]'에 대한 참조를 작성하여 참조 할 수 있도록하는 것입니다 로컬 변수로서'self.transaction_log [transaction_id] [ 'products'] = {}'를 설정하지만 바로 위의 정의에서'products ': {}'를 추가 할 수 있습니다. –

답변

2

codereview.stackexchange.com 더 적합 할 수 있습니다 :

transaction = self.transaction_log.setdefault(transaction_id, { 'products': {} }) 

# create a list of dics to be reused in 
# other class methods 
transaction.update({ 
    'gross_total': transaction.get('gross_total', 0) + gross, 
    'net_total': transaction.get('net_total', 0) + net, 
    'qty_total': transaction.get('qty_total', 0) + qty, 
    'tax_total': transaction.get('tax_total', 0) + tax, 
    'transaction_id': transaction_id, 
    'transaction_time': transaction_datetime, 
    'location_id': location_id, 
    'till_id': till_id, 
    'employee_id': employee_id 
}) 
transaction['products'].update({ 
    product_id: { 
     'gross': gross, 
     'net': net, 
     'tax': tax, 
     'qty': qty 
    } 
}) 

또한, 당신이 qty

+1

유감 스럽지만'dict.update'는 재귀 적으로 작동하지 않으므로''products''가 이미 존재하면 다른 'product_id' 항목을 제거하면 완전히 덮어 쓰게됩니다. –

+0

좋은 캐치 @ TadhgMcDonald-Jensen. 답변이 업데이트되었습니다. – Patrick

+1

'transaction.get ('gross_total', 0)'을 사용하고 있기 때문에 위에서 정의 할 필요가 없으므로 첫 번째 명령문을 단순화 할 수 있습니다. 'transaction = self.transaction_log.get (transaction_id, { 'products': {}})'또는'get' 대신에'setdefault'를 사용하면 하단에 재 할당 할 필요가 없습니다. –