Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/c/63.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

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/date/2.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
使用pythoncapi,如何找到Union_类型?_Python_C - Fatal编程技术网

使用pythoncapi,如何找到Union_类型?

使用pythoncapi,如何找到Union_类型?,python,c,Python,C,我想创建一个新的Union[int,str]类型 我想访问实例Union\u Type,创建一个新类型,如Union[int,str] PyType\u Type是公共的,所以我可以写 (PyObject*)&PyType\u类型 但是Union\u Type不是公共的,所以我不能写 (PyObject*)&联合类型 我可以添加我的C代码吗 PyAPI_数据(PyTypeObject)UnionType_类型; 代码示例: PyObject*newUnion=PyObject\u GetI

我想创建一个新的
Union[int,str]
类型

我想访问实例
Union\u Type
,创建一个新类型,如
Union[int,str]

PyType\u Type
是公共的,所以我可以写

(PyObject*)&PyType\u类型
但是
Union\u Type
不是公共的,所以我不能写

(PyObject*)&联合类型
我可以添加我的C代码吗

PyAPI_数据(PyTypeObject)UnionType_类型;
代码示例:

PyObject*newUnion=PyObject\u GetItem(&UnionType\u Type),
PyTuple_包(2,PyLong_类型和PyUnicode_类型);

我希望有一个
PyObject*
to Union类型来调用
\uuu getitem\uuuuuuuu()
并创建一个新的子类型。

这不是
Union\u类型不公开的问题<代码>联合类型
不存在<代码>键入。未通过C级全局变量定义Union;它是通过
键入
模块中的
语句定义的


如果希望通过C API访问
typing.Union
,则必须执行与Python级别完全相同的操作:
typing
和模块对象。除少数例外情况外,这与您访问任何C级可导入模块的内容时应使用的过程相同。

这不是
联合类型
不公开的问题<代码>联合类型不存在<代码>键入。未通过C级全局变量定义Union;它是通过
键入
模块中的
语句定义的

如果希望通过C API访问
typing.Union
,则必须执行与Python级别完全相同的操作:
typing
和模块对象。除少数例外情况外,这与在C级访问任何可导入模块的内容时应使用的过程相同。

解决方案:

PyObject* typing = PyImport_ImportModule("typing")
PyObject* unionType = PyObject_GetAttrString(typing,"Union");
PyObject* tuple = PyTuple_Pack(2,&PyLong_Type,&PyUnicode_Type)
PyObject *newUnion=PyObject_GetItem(unionType,tuple);
Py_DECREF(typing);
Py_DECREF(unionType);
Py_DECREF(unionType);
Py_DECREF(tuple);
解决方案:

PyObject* typing = PyImport_ImportModule("typing")
PyObject* unionType = PyObject_GetAttrString(typing,"Union");
PyObject* tuple = PyTuple_Pack(2,&PyLong_Type,&PyUnicode_Type)
PyObject *newUnion=PyObject_GetItem(unionType,tuple);
Py_DECREF(typing);
Py_DECREF(unionType);
Py_DECREF(unionType);
Py_DECREF(tuple);

你为什么要这样做<代码>联合和其他
类型
模块类型在C级几乎完全无用。它们几乎专门用于类型批注,而类型批注不能通过C API使用。如果您想为C模块提供类型批注,我相信当前的标准方法是编写存根文件。为什么要这样做<代码>联合和其他
类型
模块类型在C级几乎完全无用。它们几乎只对类型注释有用,不能通过C API使用。如果您想为C模块提供类型注释,我相信当前的标准方法是编写存根文件。