Отказ от ответственности: я автор Pykka.
В сторону: Pykka не мертва, она просто отлично работает для того, для чего она была создана: предоставляя абстракцию параллелизма для музыкального сервера Mopidy и его 100+ расширений.
Поведение Пикки со свойствами не является оптимальным, но есть причина, по которой это так.
Чтобы создать прокси-объект, Pykka должен проанализировать API целевого объекта. При проверке, являются ли доступные для целевого объекта атрибуты вызываемыми, атрибутами или «проходимыми атрибутами», getattr()
вызывается один раз для каждого атрибута. Это заставляет свойство get вызываться. См. Proxy._get_attributes()
и Actor._get_attribute_from_path()
для.
Поскольку в Python нет способа получить возвращаемое значение из установщика свойств, настройка свойства на прокси-сервере Pykka принимает безопасное заданное по умолчанию ожидание завершения для установщика, так что любые исключения, возникшие в установщике, могут быть повторно обработаны. на сайте звонка в mainThread()
. Альтернативой было бы оставить любые исключения, вызванные установщиками свойств, необработанными. Подробнее см. Proxy.__setattr__()
.
Таким образом, свойства «работают» с Pykka, но вы получаете больший контроль, используя вызовы методов, так как вы всегда получаете будущее и можете сами решить, ждать вам результата или нет.
Независимо от того, используете ли вы Pykka или нет, я считаю хорошей практикой не выполнять дорогостоящую работу по получению свойств, а вместо этого использовать надлежащие методы для выполнения «дорогой» работы.
Дизайн API напрямую влияет на то, как ваши пользователи будут использовать API:
- Объект со свойством приглашает к повторному использованию одного и того же свойства и, следовательно, к повторному пересчету. Сохраняйте свойства мертвыми простыми и дешевыми.
- Объект, представляющий метод, возвращающий результат, обычно приводит к тому, что вызывающая сторона сохраняет результат в переменной и повторно использует один и тот же результат вместо вызова метода несколько раз. Используйте методы для любой нетривиальной работы. Если это действительно дорого, рассмотрите другой префикс, отличающийся от
get_
, например load_
, fetch_
или calculate_
, что дополнительно указывает на то, что пользователь должен держать указатель на результат и использовать его повторно.
Чтобы самому следовать этим принципам, основной API Mopidy давно перешел от использования множества свойств к использованию методов получения и установки. В следующем основном выпуске все свойства будут удалены из основного API Mopidy. Благодаря тому, как работает создание прокси, эта очистка значительно сократит время запуска Mopidy.