IMO, it's a good thing that decode() doesn't on strings in Python 3.
It does seem in the spirit of Python's duck typing to be able to say '616263'.decode('hex') and get 'abc', and that does work fine in py2. Try it in py3 and you get a type error. So ok, convert the string to bytes, e.g. by saying b'616263' instead of '616263'. That doesn't work either, but I'll leave the experiment to you.
codecs.decode(b'616263', 'hex')
If that's correct, what's so hard/bad about this?