python2:杂记
前段时间完成了功能模块自动化测试python脚本,中间遇到了一些解决了的问题,记录下:
1:字典实现类似于C语言的查表调用
在C中函数名 = 表示函数地址的变量,想要查表调用只需要定义对应类型的结构体数组即可。
而python中想要实现需要借助于匿名调用lambda 表达式
例如想要发送kl15 on信号,初次是这么写的:
test_conditioncase = { "KL15On": toolCan.appl.changeSignalVaules(project["KL15On"])}
调用:test_conditioncase["KL15On"]()
提示报错,加()是表示这是个函数调用,对toolCan实例类中的appl执行changeSignalVaules方法,但是因为没有注册,所以提示无法调用。
需要用 MAXIMUM = lambda x,y : (x > y) * x + (x < y) * y lambda表达式进行匿名调用注册
最终正确的写法:
"KL15On": lambda: toolCan.appl.changeSignalVaules(project["KL15On"])
尝试用再包一层宏,没有成功,就是需要直接lambda直接定义匿名调用
而最终从字典中调用是这样的形式:
test_condition_state[f]()
2:python中字符串相关处理操作
python3中将byte(二进制数据流)与str(文本格式)格式做了明确的区分。
关于编码和解码:详见:浅析Python3中的bytes和str类型 - Chown-Jane-Y - 博客园 (cnblogs.com)
一言来说:byte -->str 解码 str --> byte 编码
而串口接口读出的是比特流,需要解码转换为字符串 使用的是utf8格式
Originallogstr = Originallogbyte.decode('utf8')
用print 打印出两者后,比特流会用 b'str内容' 表示这是byte格式
而经过转换后,logstr和logbyte都可以像列表一样通过下标去访问对应的位置,下标相同,访问到的元素是一样的。
需要注意的是,想要对logbyte的元素做解析判断时,同样需要加b'' 例如寻找判断log中的换行符:
if Originallogbyte[strid:strid+2] == b'\r\n':
字符串中的判断则是正常的 ""
if Originallogstr[strid+1:strid+6] == "POWER":
,以上是解析log的一部分功能,实际上如果单次寻找,可以直接用python str内置的find方法:
if self.sectionstr[logid].find("State machine IVI") != -1:
arrowposi = self.sectionstr[logid].find("-->")
两钟返回值:如果没有找到,返回-1 如果找到,返回第一次找到的该字符串的首位置。
3:初次写脚本,一些点:
a 字典,列表都有内置的__len__方法,会返回该字典\列表的长度
for transcase in range(test_result_case.__len__()):
经常这样用,range会生成一个从0开始的到某个长度的列表。# len = 5 则生成 [0,1,2,3,4]
b list 方法
self.IVIstateoldtonew.append(IVI_State[IVIstateid])
用于在列表末尾添加要添加的项 # 这里有坑,据说是只添加项的引用,项有变化的时候要copy出来处理
self.IVIstateoldtonew.clear()
用于清除列表
c 类下定义的方法无法访问其他方法内部的变量,想要共享要在类名下,方法外部定义共享变量
其他后续再补充
现在看来,面向过程的语言,与面向对象的语言,无非就是过程是讲功能(函数)与变量分开了。
而面向对象是将两者结合在一起,函数谓之方法,结构体谓之类。如是而已

浙公网安备 33010602011771号