title: Inheritance best practice : *args, **kwargs or explicitly specifying parameters
body: <p>I often find myself overwriting methods of a parent class, and can never decide if I should explicitly list given parameters or just use a blanket <code>*args, **kwargs</code> construct. Is one version better than the other? Is there a best practice? What (dis-)advantages am I missing?</p>
  
  <pre><code>class Parent(object):
  
      def save(self, commit=True):
          # ...
  
  class Explicit(Parent):
  
      def save(self, commit=True):
          super(Explicit, self).save(commit=commit)
          # more logic
  
  class Blanket(Parent):
  
      def save(self, *args, **kwargs):
          super(Blanket, self).save(*args, **kwargs)
          # more logic
  </code></pre>
  
  <p><strong>Perceived benefits of explicit variant</strong></p>
  
  <ul>
  <li>More explicit (Zen of Python)</li>
  <li>easier to grasp</li>
  <li>function parameters easily accessed</li>
  </ul>
  
  <p><strong>Perceived benefits of blanket variant</strong></p>
  
  <ul>
  <li>more DRY</li>
  <li>parent class is easily interchangeable</li>
  <li>change of default values in parent method is propagated without touching other code</li>
  </ul>