К вопросу о кроссплатформности
Jun. 29th, 2015 11:34 pmПогонял сегодня ctypescrypto на разных платформах (после того как мне отрепортили баг, что на MacOS у меня динамическая библиотека неправильно ищется)
Под Windows пришлось поправить 1 тест. Любимая моя привычка - создавать временный файл и не закрывать. А потом удивляться - а что это на некторых платформах его по второму разу открыть не могут.
Под linx/armhf - ну даже не интересно.
Под pypy - работает. Сходу.
Под python3 - ожидаемо не работает. Для модуля который активно работает как с байтами, так и с юникодом, это неудивительно. Вопрос в том, а можно ли принципиально сделать этот модуль таким, чтобы был совместим с обоими версиями. По-моему нет.
Потому что полно объектов, у которых определены методы __str__ и __unicode__, которые должны быть переименованы, соответственно, в __bytes__ и __str__
Под Windows пришлось поправить 1 тест. Любимая моя привычка - создавать временный файл и не закрывать. А потом удивляться - а что это на некторых платформах его по второму разу открыть не могут.
Под linx/armhf - ну даже не интересно.
Под pypy - работает. Сходу.
Под python3 - ожидаемо не работает. Для модуля который активно работает как с байтами, так и с юникодом, это неудивительно. Вопрос в том, а можно ли принципиально сделать этот модуль таким, чтобы был совместим с обоими версиями. По-моему нет.
Потому что полно объектов, у которых определены методы __str__ и __unicode__, которые должны быть переименованы, соответственно, в __bytes__ и __str__
no subject
Date: 2015-06-29 10:03 pm (UTC)no subject
Date: 2015-06-30 04:41 am (UTC)no subject
Date: 2015-06-30 05:43 am (UTC)no subject
Date: 2015-06-30 06:43 am (UTC)no subject
Date: 2015-06-30 09:16 am (UTC)no subject
Date: 2015-06-29 10:21 pm (UTC)а как же модуль six и декоратор @six.python_2_unicode_compatible?
no subject
Date: 2015-06-30 04:45 am (UTC)no subject
Date: 2015-06-29 11:49 pm (UTC)no subject
Date: 2015-06-30 04:40 am (UTC)Оно в основном решает проблемы совместимости переименованных стандартных модулей. НУ еще всяких встроенных функций вроде print и exec.
А определять методы __bytes__ и __unicode__ оно не помогает.
no subject
Date: 2015-06-30 01:11 am (UTC)Объекты рефакторить, унаследовав от того, что будет данные методы определять в зависимости от версии.
См. также https://docs.python.org/3.3/howto/pyporting.html#str-unicode
В крайнем случае, в Makefile или чего там засунуть 2to3 .
no subject
Date: 2015-06-30 04:43 am (UTC)no subject
Date: 2015-06-30 05:26 am (UTC)Глянул, вот несколько советов/замечаний.
Не нужно определять пустой __del__, сборщик мусора этого не любит. Лучше вообще не надеяться на __del__ и предоставить явные методы для очистки. А заодно и поддержку протокола контекстного менеджера (__enter__/__exit__), если это имеет смысл.
В __eq__ нужно сперва проверять тип правого операнда. Если что-то левое — возвращать NotImplemented. Аналогично __ne__ должен проверять возвращаемое значение на NotImplemented. Впрочем, в последних (или грядущих) багфиксовых выпусках умолчальный __ne__ делает всё, что нужно, определять его явно будет не нужно.
Пока API не устоялось, многие безаргументные методы можно было бы сделать свойствами. self.oid.longname выглядит лучше, чем self.oid().longname(). Вижу, местами ты используешь свойства, но непоследовательно.
В нескольких местах пропущена пустая строка между методами.
no subject
Date: 2015-06-30 06:45 am (UTC)