в n-ный раз пытаюсь портировать хоть самые простые вещи на python3, и снова попадаю на байты и строки
в python2 было всё просто и понятно, есть str, есть unicode, и str всегда совместима с unicode
в python3 даже самый простейший код у меня нарывается на неприятности
в python2 был вот такой код:
def hsh(s):
out = base64.urlsafe_b64encode(hashlib.sha256(s).digest())
return out.replace('-', '').replace('_', '')[:8].ljust(8,'A')
всё работало отлично. в python3 же он говорит следующее:
File "/today/51t/sx.py", line 12, in hsh
out = base64.urlsafe_b64encode(hashlib.sha256(s).digest())
TypeError: Unicode-objects must be encoded before hashing
окей, байтуем, заменяем s на s.encode('utf-8'). получаем:
File "/today/51t/sx.py", line 9, in hsh
return out.replace('-', '').replace('_', '')[:8].ljust(8,'A')
TypeError: a bytes-like object is required, not 'str'
ну да, у нас теперь байтовая строка, а по слухам в третьем python они уже несовместимы. делаем out=str(out) или out=out.decode('utf-8'), без разницы... и получаем в итоге:
Traceback (most recent call last):
File "run.py", line 3, in <module>
import os, appw
File "/today/51t/appw.py", line 60, in <module>
appz[x]=parse_dir(x)
File "/today/51t/appw.py", line 44, in parse_dir
append_hashes(rootdir,n,subdir)
File "/today/51t/appw.py", line 25, in append_hashes
hashlist[dp+n] = hsh( open(dp + n).read() )
File "/usr/local/lib/python3.6/codecs.py", line 321, in decode
(result, consumed) = self._buffer_decode(data, self.errors, final)
UnicodeDecodeError: 'utf-8' codec can't decode byte 0x89 in position 0: invalid start byte
у меня нет даже малейшего представления о том, что этой шарманке надо. походу, ближайшие лет 20 python3 лучше не трогать :), а там и новый, более вменяемый, выйдет :)