#python #cython #python-3.7 #namedtuple #python-dataclasses
#python #cython #python-3.7 #namedtuple #python-классы данных
Вопрос:
Я заинтересован в передаче данных между Python и Cython code, чтобы данные были доступны из C и без GIL. Я думаю о достижении этого с помощью классов данных (начиная с py3.7), именованных кортежей (с хорошим синтаксисом определения начиная с py3.6) или типов расширений Cython (cdef classess).
К сожалению, классы данных и именованные кортежи, похоже, обрабатываются как универсальные объекты из Cython без какой-либо поддержки компиляции в C.
Можно использовать типы расширений Cython (классы cdef), но у них есть много недостатков по сравнению с классами данных, самое главное, что вы должны реализовать __init__
с помощью шаблонного кода для настройки всех атрибутов вашего класса, верно?
Комментарии:
1. Если вы планируете использовать 3.x — зачем использовать тег с python-2.7?
2. @PatrickArtner Извините, опечатка, исправлена в версии 3.7!
3. При беглом взгляде кажется, что
dataclasses
это просто модуль фабрики классов с декораторами и тому подобным, который упрощает создание классов с общими атрибутами или методами. Я думаю, что это не добавляет никакой новой функциональности класса. Я не вижу смысла пытаться использовать или реализовать это вcython
.4. Аналогично, зачем использовать
namedtuples
вcython
. Почему не простые кортежи или списки?5. @hpaulj Классы данных и namedtuples позволяют писать гораздо более краткий и приятный код. И поскольку я считаю, что Cython стремится предоставить способ написания хорошего кода на pythonic с производительностью на C, было бы полезно поддерживать namedtuples или классы данных с точки зрения их компиляции в C.
Ответ №1:
Я спросил разработчиков Cython, и они открыли запрос функции для реализации @dataclass
для типов расширений (классов cdef): https://github.com/cython/cython/issues/2903 . Так что, надеюсь, они скоро будут поддерживаться в Cython.