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 类下定义的方法无法访问其他方法内部的变量,想要共享要在类名下,方法外部定义共享变量

 

其他后续再补充

 

现在看来,面向过程的语言,与面向对象的语言,无非就是过程是讲功能(函数)与变量分开了。

而面向对象是将两者结合在一起,函数谓之方法,结构体谓之类。如是而已

 

posted @ 2021-05-21 11:39  无头之蝇  阅读(64)  评论(0)    收藏  举报