vitus_wagner: My photo 2005 (Default)
[personal profile] vitus_wagner
Погонял сегодня ctypescrypto на разных платформах (после того как мне отрепортили баг, что на MacOS у меня динамическая библиотека неправильно ищется)

Под Windows пришлось поправить 1 тест. Любимая моя привычка - создавать временный файл и не закрывать. А потом удивляться - а что это на некторых платформах его по второму разу открыть не могут.

Под linx/armhf - ну даже не интересно.

Под pypy - работает. Сходу.

Под python3 - ожидаемо не работает. Для модуля который активно работает как с байтами, так и с юникодом, это неудивительно. Вопрос в том, а можно ли принципиально сделать этот модуль таким, чтобы был совместим с обоими версиями. По-моему нет.
Потому что полно объектов, у которых определены методы __str__ и __unicode__, которые должны быть переименованы, соответственно, в __bytes__ и __str__

Date: 2015-06-29 10:03 pm (UTC)
From: [identity profile] tanner-of-kha.livejournal.com
Ну что значит "нет"? Есть же sys.version_info.

Date: 2015-06-30 05:43 am (UTC)
ext_605364: geg MOPO4 (Default)
From: [identity profile] gegmopo4.livejournal.com
Ну можно и так, тоже вариант. Но у тебя там дифф будет очень маленький, и никакого вреда от __unicode__ или __cmp__ в Python 3 не будет.

Date: 2015-06-30 09:16 am (UTC)
From: [identity profile] tanner-of-kha.livejournal.com
Не думаю. Вообще напрашивается простенький миксин, который будет разбираться с версией и жонглировать методами через super(). Хотя тут ниже товарищи подсказывают six, это наверняка в нём реализовано.

Date: 2015-06-29 10:21 pm (UTC)
From: [identity profile] do-dodo.livejournal.com
>Потому что полно объектов, у которых определены методы __str__ и __unicode__, которые должны быть переименованы, соответственно, в __bytes__ и __str__


а как же модуль six и декоратор @six.python_2_unicode_compatible?

Date: 2015-06-29 11:49 pm (UTC)
From: [identity profile] amarao-san.livejournal.com
six не помогает? Вроде, специальная либа для "кросс-питоновской" разработки.

Date: 2015-06-30 01:11 am (UTC)
From: [identity profile] onanim.wordpress.com (from livejournal.com)
"Потому что полно объектов, у которых определены методы __str__ и __unicode__, которые должны быть переименованы, соответственно, в __bytes__ и __str__"

Объекты рефакторить, унаследовав от того, что будет данные методы определять в зависимости от версии.
См. также https://docs.python.org/3.3/howto/pyporting.html#str-unicode

В крайнем случае, в Makefile или чего там засунуть 2to3 .

Date: 2015-06-30 05:26 am (UTC)
ext_605364: geg MOPO4 (Default)
From: [identity profile] gegmopo4.livejournal.com
Поддержку двух версий в Питоне сделать не сложнее, чем поддержку, допустим Linux и Solaris в C с помощью препроцессора. if может быть и в теле класса. А часто можно вообще не париться и предоставлять оба интерфейса, Python 2 и Python 3, если не конфликтуют (например __cmp__ и __lt__).

Глянул, вот несколько советов/замечаний.

Не нужно определять пустой __del__, сборщик мусора этого не любит. Лучше вообще не надеяться на __del__ и предоставить явные методы для очистки. А заодно и поддержку протокола контекстного менеджера (__enter__/__exit__), если это имеет смысл.

В __eq__ нужно сперва проверять тип правого операнда. Если что-то левое — возвращать NotImplemented. Аналогично __ne__ должен проверять возвращаемое значение на NotImplemented. Впрочем, в последних (или грядущих) багфиксовых выпусках умолчальный __ne__ делает всё, что нужно, определять его явно будет не нужно.

Пока API не устоялось, многие безаргументные методы можно было бы сделать свойствами. self.oid.longname выглядит лучше, чем self.oid().longname(). Вижу, местами ты используешь свойства, но непоследовательно.

В нескольких местах пропущена пустая строка между методами.

Profile

vitus_wagner: My photo 2005 (Default)
vitus_wagner

March 2026

S M T W T F S
1 2 34567
8 910 1112 13 14
15161718192021
22232425262728
293031    

Most Popular Tags

Style Credit

Expand Cut Tags

No cut tags
Page generated Mar. 14th, 2026 11:02 am
Powered by Dreamwidth Studios