Boost :: Python- possible de convertir automatiquement à partir de dict - & gt; std :: carte?
J'ai une classe C++, avec une fonction membre qui permet de prendre un petit-de-grand nombre de paramètres. Permet nom de ces paramètres, a-f. Tous les paramètres ont des valeurs par défaut. En tant que partie du projet de python je travail, je tiens à exposer cette classe pour python. Actuellement, la fonction de membre ressemble à quelque chose comme ceci:
class myClass {
public:
//Constructors - set a-f to default values.
void SetParameters(std::map<std::string, double> &);
private:
double a, b, c, d, e, f;
}
void myClass::SetParameters(std::map<std::string, double> const& params) {
//Code to iterate over the map, and set any found key/value pairs to their
//corresponding variable. i.e.- "a" --> 2.0, would set myClass::a to 2.0
}
Idéalement, en Python, je tiens à le faire à l'aide d'un dict:
>>> A = myModule.myClass();
>>> A.SetParameters({'a': 2.2, 'd': 4.3, b: '9.3'})
De cette façon, l'utilisateur peut entrer les valeurs dans n'importe quel ordre, et entrer n'importe quel nombre d'entre eux à être dépassé. Toute réflexion sur la façon dont cela peut être réalisé dans boost::python? Il me semble que je peux le faire via la modification de la carte d'entrée pour un boost::python objet, et à l'aide de l'extrait de fonctions. Cependant, cela m'obligerait à modifier l'interface de ma bibliothèque (je préfère le garder le std::carte d'interface, et avoir une certaine intermédiaire/auto technique de conversion de la version de python). Pensées?
source d'informationauteur MarkD
Vous devez vous connecter pour publier un commentaire.
Je pense qu'il y a un couple de façons qui sont plus faciles à atteindre que d'écrire votre propre convertisseur. Vous pouvez utiliser boost::python map_indexing_suite pour faire la conversion pour vous, ou vous pouvez utiliser des mots clés les arguments en python. Personnellement, je préfère le mot-clé arguments, comme c'est le plus "Pythonic" façon de le faire.
Alors c'est votre classe (j'ai ajouté une définition de type de la carte):
Exemple à l'aide de map_indexing_suite:
Exemple à l'aide de mots clés arguments. Cela nécessite l'utilisation d'un raw_function wrapper:
cela permet d'écrire des trucs comme ça en Python:
Ce blog a une jolie description claire de la façon d'écrire ces convertisseurs. Le motif de base est de définir une classe qui est de la forme:
Où le constructeur est responsable de l'ajout de ce convertisseur Boost.Python registre:
La fonction
convertible
dit Boost si oui ou non ce convertisseur permet de convertir les spécifiée objet Python:La
construct
fonction crée un objet du type de conversion:et puis dans votre l'intérieur de votre BOOST_PYTHON_MODULE, inclure la ligne
Je suis juste de mes orteils mouillés avec boost::python ne peut donc pas répondre complètement à votre question. Mais le premier obstacle que je vois est de garantir que le py dict les touches sont toutes les chaînes. Python dicts peut également être saisi sur les n-uplets (et je suppose que plusieurs types).