如何进行处理Python对象参数解析

开发 后端
Python将被更加广泛地应用于各个领域,为了克服脚本语言执行速度慢的问题,Python对象提供了相应的C语言扩展接口,通过将影响执行性能的关键代码用C语言实现。

Python对象中使用C语言编写的扩展模块,必须将其编译成动态链接库的形式,通常使用Python的C语言扩展接口提供的函数PyArg_ParseTuple()来获得这些参数值,希望本文能够对大家有帮助。

Python是用C语言实现的一种脚本语言,本身具有优良的开放性和可扩展性,并提供了方便灵活的应用程序接口(API)。从而使得C/C++程序员能够在各个级别上对Python解释器的功能进行扩展。在使用C/C++对Python进行功能扩展之前,必须首先掌握Python解释所提供的C语言接口。

Python是一门面向对象的脚本语言,所有的对象在Python解释器中都被表示成PyObject,PyObject结构包含Python对象的所有成员指针。并且对Python对象的类型信息和引用计数进行维护。在进行Python的扩展编程时,一旦要在C或者C++中对Python对象进行处理,就意味着要维护一个PyObject结构。

Python的C语言扩展接口中,大部分函数都有一个或者多个参数为PyObject指针类型,并且返回值也大都为PyObject指针。为了简化内存管理,Python通过引用计数机制实现了自动的垃圾回收功能,Python中的每个对象都有一个引用计数。

用来计数该对象在不同场所分别被引用了多少次。每当引用一次Python对象,相应的引用计数就增1,每当消毁一次Python对象,则相应的引用就减1,只有当引用计数为零时,才真正从内存中删除Python对象

下面的例子说明了Python解释器如何利用引用计数来对Pyhon对象进行管理:

  1. #include <Python.h> 
  2.  
  3. PyObject* wrap_fact(PyObject* self, PyObject* args)   
  4. {  
  5.   int n, result;  
  6.     
  7.   if (! PyArg_ParseTuple(args, "i:fact", &n))  
  8.     return NULL;  
  9.   result = fact(n);  
  10.   return Py_BuildValue("i", result);  
  11. }  
  12.  
  13. static PyMethodDef exampleMethods[] =   
  14. {  
  15.   {"fact", wrap_fact, METH_VARARGS, "Caculate N!"},  
  16.   {NULL, NULL}  
  17. };  
  18.  
  19. void initexample()   
  20. {  
  21.   PyObject* m;  
  22.   m = Py_InitModule("example", exampleMethods);  

在C/C++中处理Python对象时,对引用计数进行正确的维护是一个关键问题,处理不好将很容易产生内存泄漏。Python的C语言接口提供了一些宏来对引用计数进行维护,最常见的是用Py_INCREF()来增加使Python对象的引用计数增1,用Py_DECREF()来使Python对象的引用计数减1。

该函数是Python解释器和C函数进行交互的接口,带有两个参数:self和args。参数self只在C函数被实现为内联方法(built-in method)时才被用到。通常该参数的值为空(NULL),参数args中包含了Python解释器要传递给C函数的所有参数,通常使用Python的C语言扩展接口提供的函数PyArg_ParseTuple()来获得这些参数值。

方法列表中的每项由四个部分组成:方法名、导出函数、参数传递方式和方法描述。方法名是从Python解释器中调用该方法时所使用的名字。参数传递方式则规定了Python向C函数传递参数的具体形式,可选的两种方式是METH_VARARGS和METH_KEYWORDS。

其中METH_VARARGS是参数传递的标准形式,它通过Python的元组在Python解释器和C函数之间传递参数,若采用METH_KEYWORD方式,则Python解释器和C函数之间将通过Python的字典类型在两者之间进行参数传递。

【编辑推荐】

  1. 有关Python系统文件进行介绍指导
  2. 如何正确的使用Python函数
  3. 对Python 构建工具进行详细介绍分析
  4. PythonAndroid浅析Python优势所在
  5. 如何使用Python模块解析配置文件?
责任编辑:chenqingxiang 来源: NET130
相关推荐

2010-01-27 15:29:45

C++异常处理

2010-09-27 10:54:53

JVM参数配置

2010-02-22 16:05:40

Python配置

2010-02-01 10:21:36

Python编码转换

2010-02-03 13:55:51

Python 代码

2009-12-23 11:01:50

ADO.NET 批处理

2010-02-01 14:48:43

2010-02-01 17:33:24

Python主线程

2010-08-05 09:46:45

FlexAIR文件打包

2010-02-01 18:20:17

Python 多重继承

2010-02-02 16:47:12

Python主线程

2010-03-11 17:38:20

Python中文

2010-03-15 15:11:50

Python列表

2010-06-12 09:37:02

UML需求分析

2010-03-01 16:32:36

Python语言

2010-03-09 18:14:55

Python sock

2010-02-01 16:22:36

Python字符串操作

2010-03-15 15:45:15

Python编程语言

2010-03-01 11:06:52

Python 调试器

2010-03-12 19:29:15

python svn脚
点赞
收藏

51CTO技术栈公众号