2016-08-30 4 views
1

Итак, я добавляю и обновляю словарь python. В настоящее время он выглядит довольно уродливым и его трудно читать, есть ли лучший способ сделать то же самое?обновление значений словаря python

 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

Можем ли мы иметь немного больше контекста для этого кода? Просто код рефакторинга, который уже работает, обычно обрабатывается на 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 и tax

+1

К сожалению, 'dict.update' не работает рекурсивно, поэтому, если' 'products'' уже существует, он полностью отменяется, удаляя любые другие записи' product_id', которые могут быть там. –

+0

хороший ловить @ TadhgMcDonald-Jensen. ответ был обновлен. – Patrick

+1

Я также заметил, что - потому что вы используете 'transaction.get ('gross_total', 0)' нет необходимости в том, чтобы он был определен выше, чтобы вы могли упростить первый оператор как «транзакция = self.transaction_log.get (transaction_id, {'products': {}}) 'или еще лучше использовать' setdefault' вместо 'get', поэтому вам не нужно переназначать его внизу. –

Смежные вопросы