Как прекрасно обернуть c ++ Enum для python? - PullRequest
0 голосов
/ 03 мая 2019

Я нашел метод Enum wrap в boost.python, но он не решил мои проблемы.

Пожалуйста, посмотрите код:

// wrap.h
#include "./caler.h"
#include "./order_side.h"
#include <boost/python.hpp>
using namespace boost::python;

BOOST_PYTHON_MODULE(caler) { 
  class_<CALER>(
      "CALER", init<std::string>())
    .def("CalNetPnl", &CALER::CalNetPnl)
  enum_<OrderSide::Enum>("OrderSide")
    .value("Buy", OrderSide::Buy)
    .value("Sell", OrderSide::Sell);
}
// all i want is to wrap OrderSide::Enum for python
// the function CalNetPnl uses OrderSide::Enum as its parmeter


// a.py
from caler import *

cl = CALER()
print(cl.CalNetPnl("ni1904", 100.0, 1, 99.0, OrderSide.Buy))

// Caler.cpp
double CALER::CalNetPnl(std::string ticker, float open_price, int open_size, float close_price, int close_size, OrderSide::Enum close_side) {
  if (open_size != close_size) {
    printf("opensize and closesize not equal %d %d\n", open_size, close_size);
    open_size = close_size;
  }
  double gross_pnl = CalPnl(ticker, open_price, open_size, close_price, close_size, close_side);
  Fee fee = CalFee(ticker, open_price, open_size, close_price, close_size);
  double total_fee = fee.open_fee + fee.close_fee;
  return gross_pnl - total_fee;
}

И сообщение об ошибке:

Boost.Python.ArgumentError: Python argument types in
CALER.CalNetPnl(CALER, str, float, int, float, int, OrderSide.Buy)
did not match C++ signature:
CalNetPnl(CALER {lvalue}, std::string, double, int, double, int, OrderSide::Enum)

Я думаю, что OrderSide.Buy равно OrderSide::Buy, сторона заказа - это структура OrderSide {Enum {Unknown, Buy, Sell}};Кто-нибудь может помочь?

...