2016-08-30 17 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

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'を使用すると、一番下に再割当てする必要はありません。 –

関連する問題