如何完美地包装python的c++枚举?

2024-10-03 11:12:20 发布

您现在位置:Python中文网/ 问答频道 /正文

我在boost.python中找到了Enum wrap方法,但它没有解决我的问题。你知道吗

请参见代码:

// 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.BuyOrderSide::Buy,orderside是struct orderside{Enum{Unknown,Buy,Sell}; 有人能帮忙吗?你知道吗


Tags: closesizebuyenumopenfloatpriceint