首页 > 代码库 > 函数参数
函数参数
在下面这行语句里:
MessageBox(None, ‘Hello World!‘, ‘Hello World‘, 0)
括号里的就是函数的参数列表。C语言编写的函数时,定义函数的参数是使用C语言的方式来定义,那么在Python里编程是使用Python定义的类型,这两者之间是有差别的,这种差别主要体现在类型定义内存的方式不一样,比如大小不一样,就算大小一样,在Python里还有每个对象的引用计数。比如字符串在Python里是表示为一个对象,这个对象不但拥有字符串占用内存的空间,还有这个字符串引用的次数。而在C语言里只是表示拥有字符串占用内存的空间,没有引用的次数。为了在Python里能把Python的类型定义的数据对象转换为C语言的格式,是需要通过ctypes定义的类型来实现转换。在ctype里有几个Python的数据类型是默认转换的,比如None/int/bytes/string(unicode),默认的转换对应关系如下表:
Python类型 | C类型 |
None | NULL |
int | int |
bytes | char* |
string | char* |
unicode string | wchar_t* |
所以在上面MessageBox函数调用中,直接写入这些参数,就可以了,不会有报错。如果是其它的数据类型,就需要使用ctype库的类型来定义了。比如C语言里结构定义的类型,这种类型的对应关系,如下表:
ctypes类型 | C语言类型 | Python类型 |
c_bool | _Bool | bool(1) |
c_char | char | 1个字节的bytes对象 |
c_wchar | wchar_t | 1个字节的字符串对象 |
c_byte | char | int |
c_ubyte | unsigned char | int |
c_short | short | int |
c_ushort | unsigned short | int |
c_int | int | int |
c_uint | unsigned int | int |
c_long | long | int |
c_ulong | unsigned long | int |
c_longlong | __int64 或long long | int |
c_ulonglong | unsigned __int64或unsigned long long | int |
c_size_t | size_t | int |
c_ssize_t | ssize_t 或Py_ssize_t | int |
c_float | float | float |
c_double | double | float |
c_longdouble | long double | float |
c_char_p | char* | bytes对象或None |
c_wchar_p | wchar_t | 字符串或None |
c_void_p | void* | int 或None |
通过上表的关系,就可以找到所有Python里与C语言里类型相关的描述方式,这样就可以定义与之相对应的数据结构,然后把这些结构传递给函数,就可以实现相互交换数据。根据这些数据类型的定义,可以把前面的Hello World的例子修改如下:
#开发人员:蔡军生(QQ:9073204) 深圳 2014-8-11
from ctypes import *
MessageBox = windll.user32.MessageBoxW
handle = c_void_p(0)
hello = c_wchar_p(‘Hello World!‘)
title = c_wchar_p(‘Hello World‘)
mb_flag = c_int(0)
res = MessageBox(handle, hello, title, mb_flag)
在这个例子里,第一个参数是父窗口的句柄,前面是使用None来表示,现在使用c_void_p(0)来表示;显示内容的字符串在前面是直接表示,现在使用c_wchar_p(‘Hello World!‘)类型来表示,这样是表示一个UNICODE字符串;最后一个参数是使用c_int(0)来表示给函数的标志,比如显示按钮方式、是否有图标显示等等。通过ctypes里提供的类型转换,就可以无缝地对接C语言标准的动态连接库。