LINUX.ORG.RU

Как быстро преобразовать скрипт?

 ,


0

1

1. Заменить все

print что-то
на
print( что-то )

2. Заменить все

"стринг с %, {, }" % какие-то данные
на
"стринг с %, {, }".format( какие-то данные )

Всё правильно? Ничего не напутал? Что-нибудь пропустил?

Ответ: Простые случаи вроде print ловит скрипт 2to3, поставляемый с Питоном. Ещё нужно проверить все возвращаемые типы (в первую очередь, bytes вместо string), для чего покрыть весь код тестами.

На всякий случай вот эти скрипты, чтобы опять не искать:

#/usr/bin/python3
import base64
import hashlib
import sys

password, salt = sys.argv[1:3]
hashstr = hashlib.sha1( (password + salt).encode('ascii') ).hexdigest()
res = '{SSHA}' + base64.b64encode( (hashstr + salt).encode('ascii') ).decode('ascii')
print( res )
'''
--------------------------------------------------------------------------------------
'''
#/usr/bin/python3
import base64
import hashlib
import sys

inputt, password = sys.argv[1:3]
if inputt[:6] == '{SSHA}':
    inputt = inputt[6:]
else:
    print('WARNING: Cannot find "{SSHA}" marker at the start! Assuming none present.')
input_hash_salt = base64.b64decode( inputt.encode('ascii') ).decode('ascii')
input_hash, salt = input_hash_salt[:40], input_hash_salt[40:]
calc_hash = hashlib.sha1( ( password + salt ).encode('ascii') ).hexdigest()
print( 'Input and calculated hashes match: ', input_hash == calc_hash )

★★★

Последнее исправление: olegd (всего исправлений: 2)

пункт 2 будет работать в 3шке и так. Смотря что за скрипт, различий довольно много.

pawnhearts ★★★★★
()
"стринг с %, {, }" % какие-то данные

Это код некорректнен в обоих питонах.

"стринг с %, {, }".format( какие-то данные )

Это код некорректнен в обоих питонах. И не эквивалентен первому.

И % и .format() форматирование поддерживается в обоих питонах, можешь менять его постепенно руками, не уверен что 2to3 его умеет. И литерал тоже нужно менять, корректная замена выглядит так:

"стринг с %s, {, }" % какие-то данные
"стринг с {}, {{, }}".format( какие-то данные )

Что-нибудь пропустил?

Вообще-то всё пропустил.

https://docs.python.org/3/howto/pyporting.html

Разницу в работе с юникодом/байтами прежде всего.

slovazap ★★★★★
()

Из замеченного, ещё они поменяли то, что возвращает map/filter/etc. С коллекций на итераторы/генераторы и из них теперь надо явно списки строить. В циклах это роли не играет, а вот если оно возвращается из функций, то может работать не так, как хотелось.

xaizek ★★★★★
()
Ответ на: комментарий от slovazap

https://docs.python.org/3/howto/pyporting.html

Спасибо.

Разницу в работе с юникодом/байтами прежде всего.

Главной проблемой в моём случае оказалось то, что изменились типы данных в заголовках стандартных библиотек. Половина стрингов стала массивами байтов, а в версии 2 их складывали не задумываясь. Задача «расставь .encode() и .decode()».

olegd ★★★
() автор топика
Ответ на: комментарий от grem

Спасибо, уже сказали. Но он не ловит проблемы перехода со string на bytes.

olegd ★★★
() автор топика
Ответ на: комментарий от xaizek

Из замеченного, ещё они поменяли то, что возвращает map/filter/etc. С коллекций на итераторы/генераторы и из них теперь надо явно списки строить. В циклах это роли не играет, а вот если оно возвращается из функций, то может работать не так, как хотелось.

Спасибо, но повезло без этого обойтись.

olegd ★★★
() автор топика
Ответ на: комментарий от thunar

map(f,xs) на list(map(f,xs))

Не пригодилось, но спасибо.

olegd ★★★
() автор топика

Ты придумываешь какие-то сложности. Корректный код будет работать и в 2 и в 3 совершенно одинаково, правда придётся присыпать __future__, itertools и прочим, и писать шляпу типа такой:

try:
    from cStringIO import StringIO
except:
    try:
        from StringIO import StringIO
    except ImportError:
        from io import BytesIO as StringIO
try:import cPickle as pickle
except ImportError:import pickle

а если у тебя говно было, ты напросился на проблемы сам.

anonymous
()
Ответ на: комментарий от anonymous

Хотя да, где-то 3.4+ по-моему уже потеряет совместимость на раз. Но у тебя ж 2 там, а не 3. Писать 2 совместимо с 3 не проблема.

anonymous
()
Ответ на: комментарий от anonymous

Корректный код будет работать и в 2 и в 3 совершенно одинаково,

hashed_pw = 
"{SSHA}%s" % base64.b64encode(hashlib.sha1('%s%s'%(password,salt)).hexdigest()+salt)

При переходе к новой версии вылезет несовместимость типов.

Код не мой. https://github.com/unsupported/canvas/blob/master/sis/create_ssha_passwords/s...

olegd ★★★
() автор топика
Ответ на: комментарий от vvn_black

Переписать полностью с плюшками 3.5+ уже предлагали? Хороший повод рефакторинг провести.

Рабочий день заканчивается, нужно срочно поправить конфиг, в котором нужный параметр в формате, который я впервые вижу, генерируется скриптом. Скрипт не работает.

Итог — час на ознакомление с различиями API старого и нового Питона.

olegd ★★★
() автор топика
Ответ на: комментарий от olegd

Какая гадость, чем люди только не занимаются, лишь бы не осиливать баш. Питон в стиле 20-летней давности явно не лучше.

anonymous
()
Ответ на: комментарий от olegd

изменились типы данных в заголовках стандартных библиотек

Что это значит?

Задача «расставь .encode() и .decode()».

В нормальном python3 коде encode и decode нужны довольно редко. Обычно вход и выход - файлы, их можно сразу открыть с нужной кодировкой и настройками обработки ошибок.

slovazap ★★★★★
()
Ответ на: комментарий от slovazap

Что это значит?

В приведённом примере:

"{SSHA}%s" % base64.b64encode(hashlib.sha1('%s%s'%(password,salt)).hexdigest()+salt)

На вход — password и salt — текст из командной строки.

hashlib.sha1( ... ).hexdigest() принимает bytes и возвращает текст.

Который надо соединить с текстом salt, и если перед передачей в функцию решил заранее сконвертировать для sha1() — конвертируй обратно.

base64.b64encode( ... ) принимает на вход bytes и возвращает bytes, поэтому полученный текст надо сконвертировать. Или можно было конвертировать только результат hexdigest(), если salt передать в функцию как bytes.

Для объединения с '{SSHA}' полученный результат b64encode() надо снова преобразовать в текст. Или складывать с b'{SSHA}', а потом преобразовать сумму, так как итог должен быть текстом.

Итого 4 раза из 6 возможных.

P.S. Задача облегчается тем, что весь текст — 7-битный ASCII. То есть преобразования, по сути, только меняют тип.

olegd ★★★
() автор топика
Последнее исправление: olegd (всего исправлений: 2)
Ответ на: комментарий от olegd

Итого 4 раза из 6 возможных.

Нет, тут как раз всё на месте как должно быть.

P.S. Задача облегчается тем, что весь текст — 7-битный ASCII. То есть преобразования, по сути, только меняют тип.

Машина понятия не имеет ASCII у вас там или CJK, так что не облегчается.

slovazap ★★★★★
()
Ответ на: комментарий от olegd

Для отлаживающего от кодировки ничего не меняется.

slovazap ★★★★★
()
Ответ на: комментарий от anonymous

Какая гадость

Ага, а ещё автор перепутал hexdigest() и digest().

olegd ★★★
() автор топика
Вы не можете добавлять комментарии в эту тему. Тема перемещена в архив.