2017-02-20 8 views
3

私はpyvisaで使用するための計測器クラスを作成しています。手動ですべてのSCPIコマンドを変換するのではなく(約400)の方法に、私は単なるテキストファイルにコマンドのクイックリファレンスをコピーしたいと、このようなコマンドがあるだろう。このような方法としてアップ動的に作成されたPythonクラスメソッドにローカル変数を動的に追加する方法

[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

[クラスのメソッドを動的に作成するにはどうすればいいですか?](http://stackoverflow.com/questions/17929543/how-can-i-dynamically-create-class-methods-for-a -class-in-python) – JacaByte

+0

これまでに私が得た答えは、私が見つけたものです。メソッドの作成だけではなく、もう少し問題があります。たぶん私の質問は十分ではありません。 – Jim

答えて

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__にファイルパーサーを書くことができますし、私は一般的なメソッドを書くことができます引数を解析し、実際のクエリのコマンド文字列を作成します。

関連する問題