Допустим я хочу чтобы запуская скрипт во 2м и 3м петонах, я был уверен юникодные или байтовые строки там.
вот немного г-внокода:
lol.py
# -*- coding: utf-8 -*-
#from __future__ import absolute_import, division, print_function, unicode_literals
import sys
if sys.version_info < (3, 0):
strtypes = {'bstr': str, 'ustr': unicode}
else:
strtypes = {'bstr': bytes, 'ustr': str}
def isbstr(s):
return type(s) is strtypes['bstr']
def isustr(s):
return type(s) is strtypes['ustr']
def ustr(s):
if isustr(s):
return s
elif isbstr(s):
return s.decode('utf-8')
else:
return strtypes['ustr'](s)
def bstr(s):
if isbstr(s):
return s
elif isustr(s):
return s.encode('utf-8')
else:
return strtypes['ustr'](s).encode('utf-8')
if __name__ == '__main__':
pass
и типа скрипт, активно жонглирующий строками: ololo.py
#!/usr/bin/env python
# -*- coding: utf-8 -*-
#from __future__ import absolute_import, division, print_function, unicode_literals
from pprint import pprint
import sys
from lol import *
class Smth:
a = 13
b = 666
def __repr__(self):
return '((%d/%d))' % (self.a, self.b)
def __str__(self):
return '[[%d/%d]]' % (self.a, self.b)
#def __unicode__(self):
# return '{{%d/%d}}' % (self.a, self.b)
if __name__ == '__main__':
print(sys.version_info)
s = b'\xd0\xbb\xd0\xbe\xd0\xbb\xd0\xb4'
s1 = ustr(s)
s2 = bstr(s)
pprint(s1)
pprint(s2)
print('')
smth = Smth()
#pprint(smth)
#pprint(repr(smth))
#pprint(str(smth))
#try:
# pprint(unicode(smth)):
#except:
# pass
pprint(bstr(smth))
pprint(ustr(smth))
print('')
Нормальное решение или может какие косяки? 2to3 калечить такую конструкцию не будет?