LINUX.ORG.RU

а как в этом вашем пихтоне правильно обходить несовместимость версий?

 , ,


1

1

в третьем пихтоне работает так:

exim_log = open(exim_log_file, mode="r", encoding="latin1")

во втором вот так:

exim_log = open(exim_log_file, mode="r")

способа сделать так, чтобы одной и той же строкой открывалось в обеих версиях, я не нашёл. пока что сделал через try-except, но может есть более красивые решения для этого?

и ещё, почему третий питон не может открыть файл как утфный? подумал, что, может быть, сами файл разные, но воткнул сейчас пару символов на английском в текстовый редактор, сохранил один файл как утф8, другой как iso-8859-1, ткнулся хексдампом, разницы не увидел

★★★

Несовместимость 2 и 3 ветки принято обходить с помощью специальных библиотек. Правда, код получается как говно.

tailgunner ★★★★★
()

пока что сделал через try-except, но может есть более красивые решения для этого?

А чем это некрасивое решение? В общем-то, более логичным будет проверять sys.version и в зависимости от него делать то либо другое.

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

я нубас в программировании в целом и в питоне в частности. поэтому не знаю, что красиво, а что не красиво

sys.version, похоже, парсить надо. нет ли чего-нибудь, что выдаст только версию питона?

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

На истину в последней инстанции не претендую, но я бы вынес все спорные моменты в отдельные функции с общим префиксом. И уже внутри этих функций все проверки версии и нужные/ненужные костыли: v2v3_open(...), v2v3_somefunc1(...)

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

ну, то есть, питон второй-то открывает его нормально. и сам файл врядли будет отличаться по двоичному содержанию, если его сохранить именно в утф-8. так почему же третий питон спотыкается при его открытии в формате утф8?

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

рыбку не ем - веган, никуда не сажусь - стрэйт эджер с уже имеющейся бабой. я вообще про адаптацию самого кода

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

суть проблемы непонятна. он и так по умолчанию открывает его в utf-8

Python 3.4.1 (default, Jul  6 2014, 20:01:46) 
[GCC 4.9.0] on linux
Type "help", "copyright", "credits" or "license" for more information.
>>> open('utf8.txt').read()
'Привет, мир. Я текст в utf-8.'
odii
()
Ответ на: комментарий от odii

а может, в третьем open - это и есть codesc.open? а в питон второй это не пропихнули для сохранения совместимости?

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

тоже можно, но для моего скрипта в пару строк это слишком громоздко

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

проблема как раз в том, что мой файлик не открывается в utf8, в третьем питоне нужно насильно указать кодировку latin1. а во втором - нет

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

хитро. я учусь на собственном опыте. пока что такая штука мне не была нужна, поэтому я не в курсе про неё. алсо, не слишком надёжно на первый взгляд, вдруг выйдет какой-нибудь там gcc 4.9.2.7 или python 3.2.7

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

логично. потому что во втором по умолчанию оно как набор байт, а в третьем - как строка (unicode).

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

Лучше использовать идиомы языка, на котором пишешь, иначе часто получаются довольно велосипедные конструкции.

gcc 4.9.2.7 или python 3.2.7

Я лишь показал куда копать, да и выше про version_info правильно написали. Защита от проблем в коде вроде тех, что ты написал, это вопрос полноценной реализации.

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

не слишком надёжно на первый взгляд, вдруг выйдет какой-нибудь там gcc 4.9.2.7 или python 3.2.7

if sys.version.startswith('2.7.5'):
    print "Okay"
Siado ★★★★★
()
Ответ на: комментарий от xsektorx

А вообще есть еще более «точный» способ:

>>> sys.version_info
sys.version_info(major=2, minor=7, micro=5, releaselevel='final', serial=0)
>>> sys.version_info.major
2
>>> sys.version_info.minor
7

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

А вообще, третьепитон, с его форсированными плясками вокруг юникода, не предназначен для обработки строк.

bj
()

я один читаю снейк кейс, заикаясь? EximLogFile vs exim_log_file. я не ради флейма, мне на самом деле интересно - это дело привычки или нет?

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

на серваках только второй пихтон, а мне хочется использовать его где-нибудь ещё и на будущее

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

вот это, кажется, ещё лучше. спасибо

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

поясняю: на продакшен-серверах хостинг-провайдера, системным администратором которого я являюсь

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

На правах капитана: такой способ сразу же отрубает возможность запустить без переписывания код на более старых версиях, так что я бы предпочел нормальное ветвление через мажорную версию.

Автору стоит посмотреть описание модуля двойки __future__ - иногда проще добавить импорт каких-то фич из двойки в тройку, чем писать костыли.

Mahmood
()
Ответ на: комментарий от bj
sek.tor@wk-325:~$ python3 p/hosting-tools/exim_log_analyze
Traceback (most recent call last):
  File "p/hosting-tools/exim_log_analyze", line 30, in <module>
    receiver = re.findall(r"=> ([\w\.-]+@[\w\.-]+)", line)
  File "/usr/lib/python3.4/re.py", line 206, in findall
    return _compile(pattern, flags).findall(string)
TypeError: can't use a string pattern on a bytes-like object
xsektorx ★★★
() автор топика

Ифать придётся. Питонщики же хотят красивую стандартную библиотеку, без поддержки легаси как в похапе.
Так что страдай.

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