full python 2 3 compatibility