首页 > 代码库 > 函数参数

函数参数

在下面这行语句里:

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 __int64unsigned 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的例子修改如下:

#开发人员:蔡军生(QQ9073204) 深圳  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语言标准的动态连接库。