python 有宏定义,或者枚举么

python 有宏定义,或者枚举么

抱歉,新手上路。

我在我的一个应用程序中内嵌了python. 希望可以借助python来实现一个功能强大的测试脚本功能。

现在情况是这样,我需要实现一个等待event的功能: 在测试中发送某个测试命令之后,可能需要把script停住,直到某个特定event到达。 我想会现实现一个waitevet 的method. 在waitevent中,我需要从脚本中输入event的id.  请问我怎样才能在这个eventid参数上,使用枚举,或者宏定义的办法来避免要求用户直接输入id的数字号码?

难道一定要使用词典么? 那也不是很完美,因为要多输入一对引号
使用字典。输入时使用raw_input()这样就不用输入引号了。
不过,按我的理解raw_input应该和我现在的情况没什么关系吧。

我是要在我的程序中执行测试脚本。 测试脚本中可能会有类似这样的一行

testmodule.waitEvent( 12 )

这个12是某个特定的event id. 这样看起来很不直观,我的意思是希望它能变成类似
testmodule.waitEvent( command_complete)
就像在c中我可以用宏定义,或者enum来达到的一样。

使用词典的话,似乎可以变成这样
testmodule.waitEvent( Event["commnand_complete" )

我感觉它稍微有点儿啰嗦,另外我不知道在python的世界中,是不是通常都会用这种方式来解决这类问题,似乎有点儿大炮打蚊子。

这还带来另外一个问题,我怎么才能给出这个 Event 的定义。 这个Event的定义不应当成为测试脚本的一部分,最不济,我希望能有一个“头文件”之类的方法来做到。 或者在我embdeding & extending 的时候用c直接给出定义??
Event 的定义可以放在单独的py文件里,使用时import进来

还有,你可以在这个单独的文件里定义好event的变量,像这样:
COMMAND_COMPLETE = "complete"
Event = {"complete":12,}

然后,使用的时候
testmodule.waitEvent( Event[COMMAND_COMPLETE] )

不知道我的理解对不对
如果那样就如你所说搞一个"头文件",不过在python中可是一个模块文件,里面定义了常量(其实还是变量):

如叫constants.py

COMPLETE=12
FAIL=13

使用时

import constants 或from constants import *

这样就行了。
多谢多谢,我大概有概念了。

在这儿再多问个问题吧,虽然已经解决了,但是我感觉我解决的方法不好

如前述,我是在我的程序中embedding Python.  在我原有的程序中,有型如这样的一些命令列表

{
uint cmd_id;
char* strCmdName;
char* strCmdDescription;
uint param_num;
Param_Format paramList*;
}

我本来也有一个自己的脚本解释模块,来根据cmd_name, paramlist进行命令的解析,现在我引进python来替代原有的脚本解释模块。

很自然的,我希望能够做一个python扩展模块, 把这些command都加进去。这样,在我的测试脚本中就可以使用 testmodule.command1(p1,p2,p3); 这样的形式。

问题在这里,这些command个数很多,在我的程序中处理时也不加区别,用统一的方式进行处理,所以我也希望当python回调我的c处理代码时,我也可以使用同一个处理函数来进行这些command的处理,就是说我希望能够这样:

OnPythonCallbackOnMyCommand(....)
{
   
    ...
    //根据cmd_id 得到该cmd参数个数及类型列表
   ...
    //根据参数列表构造va_list 和 format_string
    PyArg_VaParse(args,format_string,va_list);
   
    Mysystem->SendCmd(cmd_id,param_list);

}
基本的python api中,OnPythonCallbackOnMyCommand函数中只有PyObject *self, PyObject *args。 而我需要多传递一个user data: cmd_id


大概就是这么个意思。 关键就是,我要用同一个c函数来对应多个我定义的python函数回调,所以在这个c 函数中,我需要python 解释器除了记录我的callback函数,我的callback类型之外,能够多替我记录一个用户数据,然后再callback时,传递给我。这样我可以知道这个函数被调用是由哪一个python函数引起的。

现在我只能是修改python的源代码来得到这么个额外的user data. 但是我很担心这样做会影响其他模块的装载,因为我修改了这部分接口。 当然我是尽量增加一套我需要的接口,而保留原有的接口。不过仍然不是很完美的解决方法,我想问有人碰到过类似的问题吗?
你参考MUD的源代码可能更适合你。
LPC的解释方式比较适合你的要求。