For me this confusion arises because of ducktyping together with ambiguous interfaces. Take open() as example, it can return a file that reads either in binary more or <i>automatically</i> decodes into unicode strings, just based on if you passed a string argument mode=&#x27;rb&#x27; vs mode=&#x27;r&#x27;, also if you enable universal newlines it will implicitly assume some encoding. This in itself all kind of makes sense once you know it, but the danger lies in that it&#x27;s code that worked in py2, and even now it will still run because most functions that work on bytes also work on unicode. It&#x27;s not until you try to combine these variables with data from other sources(like string literals) which were&#x2F;weren&#x27;t unicode you notice this and then you don&#x27;t know which side wad correct so you randomly just shotgun either decode on one side or encode on the other side. This could be 100 lines away from where the problem should actually have been solved and people being people solves the symptoms instead of the causes.