Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/python/351.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Curl 使用默认参数将特定参数传递给Boost Python函数_Curl_Python_C++_Boost_Boost Python - Fatal编程技术网

Curl 使用默认参数将特定参数传递给Boost Python函数

Curl 使用默认参数将特定参数传递给Boost Python函数,curl,python,c++,boost,boost-python,Curl,Python,C++,Boost,Boost Python,我正试图通过Python在我的游戏引擎中创建一个很好的HTTP调用接口,但是我遇到了一点问题 我有一个函数,get\u async,它启动对指定URL的请求。该函数在http\u管理器类中定义,如下所示: struct http_manager { typedef function<void(boost::shared_ptr<http_response>)> response_callback_type; typedef function<void

我正试图通过Python在我的游戏引擎中创建一个很好的HTTP调用接口,但是我遇到了一点问题

我有一个函数,
get\u async
,它启动对指定URL的请求。该函数在
http\u管理器
类中定义,如下所示:

struct http_manager
{
    typedef function<void(boost::shared_ptr<http_response>)> response_callback_type;
    typedef function<void(size_t)> write_callback_type;

    void get_async(
        const string& url,
        const http_headers_type& headers = http_headers_type(),
        const http_data_type& data = http_data_type(),
        response_callback_type on_response = nullptr,
        write_callback_type on_write = nullptr
        );
};
但是,我想打一个这样的电话:

http.get_async('http://www.google.ca', on_response=f)
这里的关键是,我希望通过名称显式指定参数,并让所有其他参数都是默认值,就像在常规Python中一样

不幸的是,在执行此操作时,Python返回了以下错误:

ArgumentError: Python argument types in
    HttpManager.get_async(HttpManager, str)
did not match C++ signature:
    get_async(struct naga::http_manager {lvalue}, class std::basic_string<char,struct std::char_traits<char>,class std::allocator<char> > url)
    get_async(struct naga::http_manager {lvalue}, class std::basic_string<char,struct std::char_traits<char>,class std::allocator<char> > url, class std::vector<struct std::pair<class std::basic_string<char,struct std::char_traits<char>,class std::allocator<char> >,class std::basic_string<char,struct std::char_traits<char>,class std::allocator<char> > >,class std::allocator<struct std::pair<class std::basic_string<char,struct std::char_traits<char>,class std::allocator<char> >,class std::basic_string<char,struct std::char_traits<char>,class std::allocator<char> > > > > headers)
    get_async(struct naga::http_manager {lvalue}, class std::basic_string<char,struct std::char_traits<char>,class std::allocator<char> > url, class std::vector<struct std::pair<class std::basic_string<char,struct std::char_traits<char>,class std::allocator<char> >,class std::basic_string<char,struct std::char_traits<char>,class std::allocator<char> > >,class std::allocator<struct std::pair<class std::basic_string<char,struct std::char_traits<char>,class std::allocator<char> >,class std::basic_string<char,struct std::char_traits<char>,class std::allocator<char> > > > > headers, class std::map<class std::basic_string<char,struct std::char_traits<char>,class std::allocator<char> >,class std::basic_string<char,struct std::char_traits<char>,class std::allocator<char> >,struct std::less<class std::basic_string<char,struct std::char_traits<char>,class std::allocator<char> > >,class std::allocator<struct std::pair<class std::basic_string<char,struct std::char_traits<char>,class std::allocator<char> > const ,class std::basic_string<char,struct std::char_traits<char>,class std::allocator<char> > > > > data)
    get_async(struct naga::http_manager {lvalue}, class std::basic_string<char,struct std::char_traits<char>,class std::allocator<char> > url, class std::vector<struct std::pair<class std::basic_string<char,struct std::char_traits<char>,class std::allocator<char> >,class std::basic_string<char,struct std::char_traits<char>,class std::allocator<char> > >,class std::allocator<struct std::pair<class std::basic_string<char,struct std::char_traits<char>,class std::allocator<char> >,class std::basic_string<char,struct std::char_traits<char>,class std::allocator<char> > > > > headers, class std::map<class std::basic_string<char,struct std::char_traits<char>,class std::allocator<char> >,class std::basic_string<char,struct std::char_traits<char>,class std::allocator<char> >,struct std::less<class std::basic_string<char,struct std::char_traits<char>,class std::allocator<char> > >,class std::allocator<struct std::pair<class std::basic_string<char,struct std::char_traits<char>,class std::allocator<char> > const ,class std::basic_string<char,struct std::char_traits<char>,class std::allocator<char> > > > > data, class std::function<void __cdecl(class boost::shared_ptr<struct naga::http_response>)> on_response)
    get_async(struct naga::http_manager {lvalue}, class std::basic_string<char,struct std::char_traits<char>,class std::allocator<char> > url, class std::vector<struct std::pair<class std::basic_string<char,struct std::char_traits<char>,class std::allocator<char> >,class std::basic_string<char,struct std::char_traits<char>,class std::allocator<char> > >,class std::allocator<struct std::pair<class std::basic_string<char,struct std::char_traits<char>,class std::allocator<char> >,class std::basic_string<char,struct std::char_traits<char>,class std::allocator<char> > > > > headers, class std::map<class std::basic_string<char,struct std::char_traits<char>,class std::allocator<char> >,class std::basic_string<char,struct std::char_traits<char>,class std::allocator<char> >,struct std::less<class std::basic_string<char,struct std::char_traits<char>,class std::allocator<char> > >,class std::allocator<struct std::pair<class std::basic_string<char,struct std::char_traits<char>,class std::allocator<char> > const ,class std::basic_string<char,struct std::char_traits<char>,class std::allocator<char> > > > > data, class std::function<void __cdecl(class boost::shared_ptr<struct naga::http_response>)> on_response, class std::function<void __cdecl(unsigned int)> on_write)

感谢您的阅读,非常感谢您的帮助
错误消息 当Boost.Python在内部未能分派函数时,异常消息仅捕获位置参数。异常消息试图捕获调用方的意图,但以C++函数调用格式显示。因为C++只支持位置参数,所以没有明显的格式来显示非位置参数。考虑这个简单:

#包括
void f(){}
BOOST_PYTHON_模块(示例)
{
boost::python::def(“f”,&f);
}
调用
example.f(a=0)
会抛出
Boost.Python.ArgumentError
,并显示以下消息:

回溯(最近一次呼叫最后一次):
文件“”,第2行,在
ArgumentError:中的Python参数类型
示例f()
与C++签名不匹配:
f(无效)
尽管Boost.Python完全知道调用方提供了参数,但异常只捕获了位置参数。在上面的示例中,没有位置参数,因此输出为
example.f()
。在最初的问题中,调用http.get\u async('http://www.google.ca“,on_response=f)导致异常显示
HttpManager.get_async(HttpManager,str)
,因为只提供了两个位置参数:类型为
HttpManager
的隐式自参数和
str
对象

调度失败 <>在C++中,默认参数不是函数类型的一部分。此外,当调用具有默认参数的函数时,默认参数仅在缺少尾随参数的情况下使用。例如,考虑:

void f(int a,int b=1,int c=2);
上述函数的类型为
void(int,int,int)
,无法调用函数
f
,只能为参数
a
c
提供参数。如果希望使用参数
c
的非默认值调用
f
,则必须提供所有三个参数

但是,如果使用Python中声明的类似函数,则可以调用
f
,只为参数
a
c
提供参数,因为Python支持关键字参数:

定义f(a,b=1,c=2): 通过 f(0,c=42)#调用f(0,b=1,c=42)

考虑将默认参数的C++函数作为重载Python函数提供:

#包括
void f(inta,intb=1,intc=2){
BOOST_PYTHON_函数_重载(f_重载,f,1,3)
BOOST_PYTHON_模块(示例)
{
名称空间python=boost::python;
python::def(“f”、&f、f_重载(
python::args(“a”、“b”、“c”);
}
BOST.Python已经被告知C++函数<代码> f>代码>有一种类型的<代码>空洞(int,int,int)< />代码,可以用最少1个参数调用,最多可以调用3个。Python也不知道默认参数值是什么。因此,Boost.Python创建重载以支持调用:

  • f(int a)
  • f(inta,intb)
  • f(int,a,intb,intc)
因此,当试图在Python中调用
example.f(0,c=42)
时,函数分派将失败,因为Boost.Python在为
c
提供值时需要为
b
提供值,并且未指定
b
的值

回溯(最近一次呼叫最后一次):
文件“”,第2行,在
ArgumentError:中的Python参数类型
示例.f(int)
与C++签名不匹配:
f(INTA)
f(整数a,整数b)
f(整数a,整数b,整数c)
这就是为什么
http.get\u async('http://www.google.ca,on_response=f)
失败,因为Boost.Python无法调用:

http\u管理器。获取异步(url,on\u响应);
为Python提供默认参数 为了继续这个示例,如果Python提供了默认参数,那么它可以为非尾随参数提供值。公开函数时,可以通过为对象赋值为参数提供默认值。下面使用默认参数公开函数
f

#包括
void f(inta,intb=1,intc=2){
BOOST_PYTHON_函数_重载(f_重载,f,1,3)
BOOST_PYTHON_模块(示例)
{
名称空间python=boost::python;
python::def(“f”、&f、f_重载(
(python::arg(“a”),
python::arg(“b”)=1,
python::arg(“c”)=2);
}

由于Boost.Python知道默认参数,因此它可以成功调用
example.f(0,c=42)

给定函数签名、参数类型和名称,我建议阅读答案,了解Boost.Python中使用Python回调处理多线程的详细信息。我的回调系统将相当简单。所有的
on_response
on_write
回调都将延迟到每一帧的开始,并由主线程调用,因此我认为我不需要处理GIL的管理。哦,天哪,我完全错过了你问题的底部部分
ArgumentError: Python argument types in
    HttpManager.get_async(HttpManager, str)
did not match C++ signature:
    get_async(struct naga::http_manager {lvalue}, class std::basic_string<char,struct std::char_traits<char>,class std::allocator<char> > url)
    get_async(struct naga::http_manager {lvalue}, class std::basic_string<char,struct std::char_traits<char>,class std::allocator<char> > url, class std::vector<struct std::pair<class std::basic_string<char,struct std::char_traits<char>,class std::allocator<char> >,class std::basic_string<char,struct std::char_traits<char>,class std::allocator<char> > >,class std::allocator<struct std::pair<class std::basic_string<char,struct std::char_traits<char>,class std::allocator<char> >,class std::basic_string<char,struct std::char_traits<char>,class std::allocator<char> > > > > headers)
    get_async(struct naga::http_manager {lvalue}, class std::basic_string<char,struct std::char_traits<char>,class std::allocator<char> > url, class std::vector<struct std::pair<class std::basic_string<char,struct std::char_traits<char>,class std::allocator<char> >,class std::basic_string<char,struct std::char_traits<char>,class std::allocator<char> > >,class std::allocator<struct std::pair<class std::basic_string<char,struct std::char_traits<char>,class std::allocator<char> >,class std::basic_string<char,struct std::char_traits<char>,class std::allocator<char> > > > > headers, class std::map<class std::basic_string<char,struct std::char_traits<char>,class std::allocator<char> >,class std::basic_string<char,struct std::char_traits<char>,class std::allocator<char> >,struct std::less<class std::basic_string<char,struct std::char_traits<char>,class std::allocator<char> > >,class std::allocator<struct std::pair<class std::basic_string<char,struct std::char_traits<char>,class std::allocator<char> > const ,class std::basic_string<char,struct std::char_traits<char>,class std::allocator<char> > > > > data)
    get_async(struct naga::http_manager {lvalue}, class std::basic_string<char,struct std::char_traits<char>,class std::allocator<char> > url, class std::vector<struct std::pair<class std::basic_string<char,struct std::char_traits<char>,class std::allocator<char> >,class std::basic_string<char,struct std::char_traits<char>,class std::allocator<char> > >,class std::allocator<struct std::pair<class std::basic_string<char,struct std::char_traits<char>,class std::allocator<char> >,class std::basic_string<char,struct std::char_traits<char>,class std::allocator<char> > > > > headers, class std::map<class std::basic_string<char,struct std::char_traits<char>,class std::allocator<char> >,class std::basic_string<char,struct std::char_traits<char>,class std::allocator<char> >,struct std::less<class std::basic_string<char,struct std::char_traits<char>,class std::allocator<char> > >,class std::allocator<struct std::pair<class std::basic_string<char,struct std::char_traits<char>,class std::allocator<char> > const ,class std::basic_string<char,struct std::char_traits<char>,class std::allocator<char> > > > > data, class std::function<void __cdecl(class boost::shared_ptr<struct naga::http_response>)> on_response)
    get_async(struct naga::http_manager {lvalue}, class std::basic_string<char,struct std::char_traits<char>,class std::allocator<char> > url, class std::vector<struct std::pair<class std::basic_string<char,struct std::char_traits<char>,class std::allocator<char> >,class std::basic_string<char,struct std::char_traits<char>,class std::allocator<char> > >,class std::allocator<struct std::pair<class std::basic_string<char,struct std::char_traits<char>,class std::allocator<char> >,class std::basic_string<char,struct std::char_traits<char>,class std::allocator<char> > > > > headers, class std::map<class std::basic_string<char,struct std::char_traits<char>,class std::allocator<char> >,class std::basic_string<char,struct std::char_traits<char>,class std::allocator<char> >,struct std::less<class std::basic_string<char,struct std::char_traits<char>,class std::allocator<char> > >,class std::allocator<struct std::pair<class std::basic_string<char,struct std::char_traits<char>,class std::allocator<char> > const ,class std::basic_string<char,struct std::char_traits<char>,class std::allocator<char> > > > > data, class std::function<void __cdecl(class boost::shared_ptr<struct naga::http_response>)> on_response, class std::function<void __cdecl(unsigned int)> on_write)
BOOST_PYTHON_MEMBER_FUNCTION_OVERLOADS(http_manager_get_async_overloads, http_manager::get_async, 1, 5)

class_<http_manager, noncopyable>("HttpManager", no_init)
    .def("get_async", &http_manager::get_async, http_manager_get_async_overloads(args("url", "headers", "data", "on_response", "on_write")))
    ;