Hm, I never saw this as ambiguous at all, except for a few weird encodings that Python has as &quot;convenience&quot; method.<p>Here&#x27;s how you remember it: &quot;Unicode&quot; is <i>not</i> an encoding.  It never was, it never will be.  Of course, the data must be encoded in memory somehow, but in Python 3, you cannot be sure what encoding that is because it&#x27;s not really exposed to the user.  From what I understand, there are different encodings that string objects will use, transparently, in order to save memory!<p>You always &quot;encode&quot; something into bytes, and &quot;decode&quot; bytes back into something.  There should be exactly two functions, because the functions have different types: &quot;encode&quot; is str -&gt; bytes, &quot;decode&quot; is bytes -&gt; str.  Explicit is better than implicit.<p><pre><code>    output = input.decode(self.coding)
</code></pre>
With Python 3, I instantly know that &quot;input&quot; is bytes and &quot;output&quot; is str.