2010-10-15 11 views
8

Mam kilka klas i interfejsów API napisany w C++ i narażonych na Pythonie z pomocą Boost.PythonPythona do C++ funkcja konwersji przy użyciu Boost.Python

Jestem obecnie badającej możliwości tworzenia następujące architektury.
W python:

from boostPythonModule import * 
AddFunction(boostPythonObject.Method1, args) 
AddFunction(boostPythonObject.Method2, args) 
AddFunction(boostPythonObject.Method2, args) 
RunAll() # running is done by C++ 

W C++:

void AddFunction(boost::object method, boost::object args) 
{ 
    /// 1. Here i need to extract a real pointer to a function 
    /// 2. Make argument and type checking for a function under method 
    /// 3. Unpack all arguments to native types 
    /// 4. Store the pointer to a function somewhere in local storage 
} 

void RunAll() 
{ 
    /// 1. run all previously stored functions and arguments for them 
} 

Zasadniczo staram się umieścić wszystkie funkcje do rodzimej część mojego programu. Chodzi o to, że nie jestem pewien, czy możliwe jest wyodrębnienie wszystkich wymaganych danych z Boost metainfo, aby zrobić to w sposób ogólny - podczas kompilacji nie powinienem wiedzieć, jakie funkcje mam wywoływać i jakie argumenty akceptują.

Kilka pytań:
1. Czy istnieją udostępnione tabele informacji w języku Python, do których mogę uzyskać dostęp w celu sprawdzenia niektórych z tych rzeczy?
2. Boost.Python wykonuje sprawdzanie argumentów typu. Czy można go ponownie wykorzystać osobno?

Daj mi znać swoje myśli.

Dzięki

+0

Naprawdę trzeba sprawdzić wszystkie typy w 'AddFunction()'? Czy nie wystarczy po prostu przechowywać metodę i argumenty gdzieś i wywołać te metody w 'RunAll()' W ten sposób otrzymasz błąd związany z typem, który wystąpi podczas wykonywania metod, a Boost.Python zrobi to za ciebie . – Arlaharen

+0

Cóż, nie. Zasadniczo chodzi o zminimalizowanie luki czasowej między tymi wywołaniami funkcji, stąd wszystkie argumenty muszą zostać sprawdzone wcześniej. RuAll powinien wiedzieć tylko o wskaźnikach funkcyjnych C++ (np. Funktorach), Jakieś inne porady? – Alex

+1

W tym przypadku nie mam żadnego. :-) Nie sądzę, że jest to przypadek użycia, dla którego został zaprojektowany Boost.Python i że będzie ci ciężko go zgiąć, żeby zrobić to, co chcesz. Czy czas spędzony w Pythonie między wezwaniami do twoich metod jest tak znaczący, że musisz to zrobić? Ale myślę, że zrobiłeś swoje profilowanie ... :-) – Arlaharen

Odpowiedz

1

Myślę o funkcji buforowania i ich argumentów na poziomie Pythona - zachowaj argumenty wykorzystaniem najnowszych formularz z Keyword arguments części tutorialu i nazywają swoje funkcje C++ później unpacking saved arguments rozpakowaniu zrobić na poziomie Pythona będzie izolować się od wszelkie komplikacje typu "boost" (wszystkie testy typu zostaną wykonane na etapie RunAll, co spowolni i będzie mniej bezpieczne).

Zoptymalizowane pod względem prędkości podejście polegałoby na wdrożeniu klasy C++ przy użyciu wspólnego interfejsu, który może przyjąć wywołanie funkcji obsługującej podane argumenty i buforowanie ich wartości wewnętrznych w celu użycia w późniejszym uruchomieniu.

struct Runner { 
    virtual int run() = 0; 
}; 

struct ConcreteRunner: public Runner { 
    std::string _arg; 
    void setArguments(std::string arg) {_arg=arg;} 
    virtual int run() {clog << "ConcreteRunner is called with argument" << _arg << endl;} 
}; 

Ta metoda obsługuje przetwarzanie argumentów poza sekcją RunAll, dzięki czemu jest tak szybki, jak to możliwe.

Powiązane problemy