>>> a = 'world'
>>> b = b'hello '
>>> type(a)
<class 'str'>
>>> type(b)
<class 'bytes'>
What's new in python3 shows:
>>> str.encode(a)
b'world'
>>> bytes(a, encoding='utf-8')
b'world'
>>> bytes.decode(b)
'hello'
>>> str(b, encoding='utf-8')
'hello'
Also works:
>>> type(b.decode())
<class 'str'>
>>> b.decode()
'hello'
>>> type(str.encode(a))
<class 'bytes'>
>>> type(a.encode())
<class 'bytes'>
>>> a.encode()
b'world'
For hex:
#assuming python3
# os.random(8) return b'' (bytes)
paymentId = binascii.hexlify(os.urandom(8)) # bytes
return bytes.decode(paymentId) # str