Примечание. Перед повторением вопроса после блока кода предоставляется дополнительная информация и подробности.
Большая картинка
Я создаю библиотеку для использования на C ++ и Python , Реализация на C ++, с тонкой оболочкой для пользователей, чтобы иметь возможность создавать проекты в Python с использованием этой библиотеки с минимальным влиянием на производительность. Возможность использовать API на обоих языках является жестким требованием.
В конечном счете, я хочу упростить задачу (с точки зрения того, сколько пользователей нужно набирать на клавиатуре, чтобы делать что-то, что будет часто появляться) для пользователей этой библиотеки. Этот вопрос касается Python API.
Теперь немного глубже ...
Я работаю над проектом, в котором у меня есть класс, написанный на C ++, и я его раскрываю до Python. Я использую Pybind11, чтобы сделать это. Я хочу относиться к своему классу как к NumPy ndarray без создания копии.
Это позволит пользователям API Python работать полностью в Python, что является жестким требованием этого проекта. Использование numpy без создания копий базовых данных также является жестким требованием.
Иллюстративный пример
Допустим, я определил класс Foo
в C ++ и следовал инструкциям на pybind11, чтобы учесть следующее (на самом деле, я сделал это, за исключением части, где написано «Я хочу это ...»):
from mymodule import Foo
import NumPy as np
# assume arg1 and arg2 are defined
f = Foo(arg1)
g =Foo(arg2)
h = Foo() # Foo has multiple constructors
# I want this...
h[:] = f + g
# ...to be equivalent to this (this is the part I’ve done successfully):
H = np.array(h, copy=False)
H[:] = np.array(f, copy=False) + np.array(g, copy=False)
Вопрос
Есть ли способ сделать то, что я описал в блоке кода выше?
Это не проблема XY
Цель состоит в том, чтобы заставить пользователя печатать меньше, учитывая требование доступности данных через numpy .ndarray объекты без копирования базовых данных. В идеале это означает, что вы должны обращаться с объектами так, как будто они уже являются numpy .ndarray объектами без каких-либо дополнительных вызовов функций или операций.
До сих пор не исследовано ...
Я знаю, что это много спрашиваю Python, потому что я работаю с типом, отличным от того, что f и g - они даже не наследуются от numpy .ndarray.
Я пытался заглянуть в декораторы классов , Интересно, можно ли импортировать Foo, а затем украсить его так, чтобы f=Foo()
эквивалентно f=np.array(Foo(), copy=False)
, где Foo реализован на C ++. Я не уверен, как работают декораторы, несмотря на RTFM, если это правильный путь, или я близок к тому, чтобы доказать, что это невозможно.