title: Can parameters be contra- or covariant in Python?
body: <p>I've just now studied about covariance and contravariance in static languages (more specifically C#). This concept is rather clear to me, however I'm in doubt on how this applies to dynamic languages like Python.</p>
  
  <p>Since Python is duck typed (or structural typed) it seems to me that there is not even a notion of variance and covariance in this language?</p>
  
  <p>If I'm not mistaking, things like contravariance and covariance are checked at compile-time in a language like C#, this is possible because a variable has a type, and the value it is bound to has a type as well and these have to match or be co(ntra)- or invariant. However, since there is no notion of typing at compile-time with a language like Python I don't know how to apply this concept.</p>
  
  <p>Any thoughts?</p>
  
  <p>My thoughts:
  The concept of covariance means that whenever we expect a type of X, any subclass of X will do as well. So, in Python this doesn't come up, because there is no type check to do this. The only check that happens is wether or not the object has the necessary implementations by means of methods and attributes.</p>
  
  <p>In C# for example where we have a method:</p>
  
  <pre><code>void DoStuff(Person p)
  {
      p.Dance();
  };
  </code></pre>
  
  <p>We could very well call this method with an instance of a Student (if this is a subclass of Person). </p>
  
  <p>Now, in Python, we could very well pass in a Bird object that would not be related to Person in any way in the inheritance hierarchy(except it would also inherit from object), as long as this bird implements <code>Dance()</code>.</p>
  
  <p>This is why I'm asking about this concept. From what I understand Python is covariant and contravariant in.. well, everything?</p>