Найти - Пользователи
Полная версия: Python 2 или 3
Начало » Python для новичков » Python 2 или 3
1 2 3 4
o7412369815963
FishHook
Обратное тоже верно. Кому хватает библиотек переписанных на тройку, можно наботать и на ней
А если библиотек не хватает то можно вызывать из через Py2, для малых приложений - костыль, для больших - норма.

Будущее за py3 да и плюшки там неплохие, меня одно напрягает - как сделан уникод в py3, в py2 с кодировками гибче.
Хотя есть не маленький проект который под py2 и py3 используется, приходится совместимость поддерживать.
py.user.next
o7412369815963
меня одно напрягает - как сделан уникод в py3, в py2 с кодировками гибче
чего ?
wmnpyafn
o7412369815963
Можешь рассказать подробнее про запуск библиотек от Python 2 на python 3.
o7412369815963
py.user.next
чего ?
по большей части он стал правильней, но для примера “понижения гибкости” - пропала возможность дважды декодировать b''.decode().decode(), вообще негатив про кодировки можно почитать в блоге у Армина Роначера http://lucumr.pocoo.org/.
Хотя в ветке 3,3 это дело улучшили.

wmnpyafn
Можешь рассказать подробнее про запуск библиотек от Python 2 на python 3.
Ну тут все просто, запускаем параллельный процесс на py2 и управляем им через celery, xmlrpc, zmq…
Если задача тяжелая то можно на каждую задачу стартовать py2.

Т.е. проект может состоять из разных компонентов, в пример один из моих недавних проектов, 3 разных процесса: Основной сайт - многопоточный wsgi, авторизация - на tornadoweb (хотя думал заюзать тут node.js), реалтайм общение с клиентом - на gevent. Общая БД на MongoDB.
py.user.next
o7412369815963
вообще негатив про кодировки можно почитать в блоге у Армина Роначера
его статья

That might not seem like a big deal at first, but APIs have the attitude of spreading further. For instance opening a file will set the name attribute to a “string” of that type:

>>> open(b'/tmp/test/Schei\xc3\x9f_Encoding').name
b'/tmp/test/Schei\xc3\x9f_Encoding'

As a result every user of the .name attribute will have to force it to the right type before interacting with it. The same thing also has been true on 2.x, however on 3.x this behavior is mostly undocumented.
если бы он ошибки нашёл, а то фичу описывает как чуть ли не баг
в регулярных выражениях это описано ясно
и оно везде так работает, и правильно, что работает именно так

Python 3 unfortunately made a choice of guessing a little bit too much with unicode in some places. When I asked the question at one conference before about what people believe the default encoding for text files on Python 3 was, most were replying UTF-8. This is correct on some operating systems. It's definitely true for OS X and it's true for most linux distributions I tried. However how does Python determine that encoding? The answer is by looking into the locale settings in the environment variables.
просто высосано из пальца
какая разница, как он определяет кодировку, она произвольная

пример про суррогаты
>>> letter = '\N{LATIN CAPITAL LETTER U WITH DIAERESIS}'.encode('latin1')
>>> decoded_letter = letter.decode('utf-8', 'surrogateescape')
>>> decoded_letter
'\udcdc'
>>> decoded_letter.encode('utf-8')
Traceback (most recent call last):
  File "<stdin>", line 1, in <module>
UnicodeEncodeError: 'utf-8' codec can't encode character '\udcdc' in position 0: surrogates not allowed

>>> decoded_letter.encode('utf-8', 'surrogateescape')
b'\xdc'
>>>

This primarily means that you have two options: change all your encode() errorhandling anywhere in your codebase from ‘strict’ (which is the default) to ‘surrogateescape’ or remove surrogates from your strings.
так эти суррогаты не ожидаются, почему они должны незаметно кодироваться
в utf-16 они прекрасно кодируются без всяких обработчиков

o7412369815963
пропала возможность дважды декодировать
b''.decode().decode()
а где это нужно ?
первое декодирование выдаёт юникодовую строку, а второе что пытается сделать с ней ?
ZZZ
o7412369815963
пропала возможность дважды декодировать b''.decode().decode()
После первого decode ты получаешь массив символов юникода. Зачем, как и, главное, во что его декодировать?

Читаем мой любимый PEP-20. А если точнее вот этот пункт:
There should be one-- and preferably only one --obvious way to do it.
o7412369815963
py.user.next
его статья
Скорее эта

А вообще, повторюсь, что считаю py3 “строки-байты” более правильные.
Думаю тут дело привычки, например в py3 print “принимает” только строки, когда я в py2 всегда отправлял байты.
wsgi py3 нужно в шапку отправлять уникод, хотя логично было-б отправлять байты (хотя байты тоже может принимает, нужно проверить)
o7412369815963
С кодировками в py3 мне больше нравиться это
>>> b'123' == u'123'
False
>>> b'123' + u'123'
Traceback (most recent call last):
File “<stdin>”, line 1, in <module>
TypeError: can't concat bytes to str
в py2 результат будет “обратный”
py.user.next
o7412369815963
Скорее эта

>>> '\xe2\x98\x83'.encode('utf-8')
Traceback (most recent call last):
  File "<stdin>", line 1, in <module>
UnicodeDecodeError: 'ascii' codec can't decode byte 0xe2 in position 0: ordinal not in range(128)
>>>
вот пример там для второго питона показан, когда откуда-то берётся ascii
в третьем-то таких глюков нет

o7412369815963
в py3 print “принимает” только строки
o7412369815963
в py2 результат будет “обратный”
у них различается концепция:
в третьем байтовые объекты - это наборы байтов (чисел от 0-255)
>>> list(b'abc')
[97, 98, 99]
>>>

во втором байтовых объектов нет
это просто наборы однобайтовых символов (символов из latin1)
>>> list(b'abc')
['a', 'b', 'c']
>>> b'abc'[0][0][0]
'a'
>>>

в третьем, если тебе нужен print(), ты раскодируешь в юникод, а потом юникод передаёшь в print() (причём конкретно раскодируешь, а не полагаясь на интерпретатор)

те времена, когда в мире хватало однобайтовых кодировок, уже давно прошли (во времена доса)
то есть все программы переводят в юникод, потому что он однозначный для любых локализаций

а то, что второй питон может байтовые строки и юникодовые строки складывать, так это из-за того, что он их считает разными видами строк (простенькими и посложнее)

а в третьем байтовые объекты - это отдельный вид, это не строка
это набор байтов, которые и используются для прямой передачи по сети, хранения в файлах и так далее
pmus
пока на 2-й ветке из-за библиотек, но сильно не напрягаюсь по этому поводу
This is a "lo-fi" version of our main content. To view the full version with more information, formatting and images, please click here.
Powered by DjangoBB