我正在创建与pyvisa一起使用的乐器类。我不想手动将每个SCPI命令(大约400个)转换为方法,而是将命令快速引用复制到文本文件中并使用如下命令:
[SENSe:]TEMPerature:TRANsducer:RTD:RESistance[:REFerence]? [{MIN|MAX}]
以这样的方法结束:
def temp_tran_rtd_res_qry(*args):
<check for valid arguments>
cmd = 'TEMPerature:TRANsducer:RTD:RESistance?'
argstr = ''
for arg in args:
argstr += ' ' + arg
return self.query(cmd + argstr)
我有解析命令的句柄,我想出了如何使用setattr()
从模板函数创建具有正确名称的方法。
给我带来麻烦的部分是每个方法都知道要分配给cmd
的内容。我想我可以将原始字符串作为属性(命名类似于方法)添加到类中,并在方法中动态解析它们,但为此,能够根据其名称(或者某些东西)检索类属性的方法)。
答案 0 :(得分:1)
所以,这就是我想到的:
>>> class A(object):
pass
>>> a = A()
>>> a. # Only default 'object' methods avaliable
>>> cmdstr = '[SENSe:]VOLTage[:DC]:RANGe[:UPPer] {<range>|MIN|MAX|DEF} '
>>> querystr = """def query(cls, *args): cmd = '{s}'; return command_handler(*args, cmdstr=cmd)"""
>>> exec(querystr.format(s=cmdstr))
>>> setattr(A, command_name(command_abridge(cmdstr)), classmethod(query))
>>> a.volt_rang() # Autocomplete works
<results from command_handler()>
我可以将文件解析器编写到__init__
中,为文本文件中的每个命令字符串添加一个方法,我可以编写一个泛型方法来解析参数并为实际查询构建命令字符串