私はすでにユーザーが自分の問題を解決していることをよく知っていますが、ここでは解決策があります。入力辞書の非文字列値を避けるために、入力の検証が導入される場合があります。
ヘッダファイル
// File: test.h
#pragma once
#include <iostream>
#include <string>
#include <unordered_map>
void method(std::unordered_map<std::string, std::string>* inout) {
for(const auto& n : (*inout)) {
std::cout << "Key:[" << n.first << "] Value:[" << n.second << "]\n";
}
(*inout)["BLACK"] = "#000000";
};
インタフェースファイル
// File : dictmap.i
%module dictmap
%{
#include "test.h"
%}
%include "typemaps.i"
%typemap(in) std::unordered_map<std::string, std::string>* (std::unordered_map<std::string, std::string> temp) {
PyObject *key, *value;
Py_ssize_t pos = 0;
$1 = &temp;
temp = std::unordered_map<std::string, std::string>();
while (PyDict_Next($input, &pos, &key, &value)) {
(*$1)[PyString_AsString(key)] = std::string(PyString_AsString(value));
}
}
%typemap(argout) std::unordered_map<std::string, std::string>* {
$result = PyDict_New();
for(const auto& n : *$1) {
PyDict_SetItemString($result, n.first.c_str(),
PyString_FromString(n.second.c_str()));
}
}
%include "test.h"
テスト
import dictmap
out = dictmap.method({'WHITE' : '#FFFFFF'})
出力で更新された辞書
In[2]: out
Out[3] : {'BLACK': '#000000', 'WHITE': '#FFFFFF'}
ありがとう、たくさんのm7thon! 2番目の最後の弾丸は私が行方不明だったものでした。提供されたSwigの例から、私はあなたの最後の弾丸が(戻り値を使って)データを返す唯一の方法だと考えました。 –
@wr m7thonはこの答えにスポットが当たっています。あなたが気をつけて気をつけなければならないことの1つは、Python開発者(つまり、バインディングのユーザ)がその動作を期待していることです。理想的には、混乱を最小限に抑えたいと思っています。通常、Pythonでは入力引数を不変にするために、C++とは違って、constを介して(たとえば)/その動作が何であるかを参照しないで簡単に推論することができないためです。これはほとんどの場合、代わりにオプションとして値を返すことになります。これは、戻り値がうまく設計されたインターフェイスで成功/失敗を示すために使用されていないためです。 – Flexo