2017-04-17 11 views
0

私は現在、CANデータベースファイルを解析するためにPythonを使用しています。私は実装時にリストに問題があり、それを動作させるための簡単なパッチを付けましたが、それは一見醜いもので、より洗練されたソリューションがあるようです。リストを含む完全に新鮮な一時オブジェクトをインスタンス化する方法

私はオブジェクトCANデータベースを定義しており、そのうちの1つのメソッドはファイルを解析し、データベース内のメッセージの定義を含んでいます。私はファイル内の各行をループし、メッセージの説明を示す行を見つけたら、CANメッセージ用に定義したオブジェクトを参照する一時変数を作成します。メンバーの一部はリストです。ファイルの次の一行に基づいた方法でこれらのリストに要素を入れます。

この一時的なオブジェクトが終了したら、CANデータベースオブジェクトに追加します。この変数で参照されるデータは必要なくなったので、値Noneを割り当てて、メッセージディスクリプタを検出する次の繰り返しでclean slate変数を再インスタンス化します。それは計画だった。

次の繰り返しを経てこの変数を使用する必要がある場合、これらのリストに値を追加して、実際には空でないことがわかります。参照変数Noneに変数を代入しているにもかかわらず、リストの値は保持され、クリーンアップされなかったようです。

私の解決策は、永続的なリスト要素を取り除くための具体的な方法をさらにスタックすることでした。私は、この変数の新鮮なオブジェクトごとに行うことができますどのように

解析ループ

for line in file: 
    line = line.rstrip('\n') 
    line_number += 1 # keep track of the line number for error reporting 

    if line.startswith("BU_:"): 
     self._parseTransmittingNodes(line) 

    elif line.startswith("BO_"): 
     can_msg = self._parseMessageHeader(line).ResetSignals().ResetAttributes() 
     building_message = True 

    elif line.startswith(" SG_") and building_message: 
     can_msg.AddSignal(self._parseSignalEntry(line)) 
     # can_msg.updateSubscribers() 

    elif line == "": 
     if building_message: 
      building_message = False 
      self._messages += [can_msg] 
      can_msg = None 

リセット方法

def ResetSignals(self): 
    """ 
    Flushes all the signals from the CANMessage object. 
    """ 
    self._signals = [] 
    return self 

def ResetAttributes(self): 
    """ 
    Flushes all the attributes from the CANMessage object. 
    """ 
    self._attributes = [] 
    return self 

ここでは、ファイルのいくつかの関連部分をですか?私はそれをNoneIDisposeのようなインターフェイスをC#で割り当てるのではなく、内部のすべてをクリアする方法を持っていますか?

編集:ここではCANMessageオブジェクトの完全なソースです:

class CANMessage: 
    """ 
    Contains information on a message's ID, length in bytes, transmitting node, 
    and the signals it contains. 
    """ 
    _name = "" 
    _canID = None 
    _idType = None 
    _dlc = 0 
    _txNode = "" 
    _comment = "" 
    _signals = list() 
    _attributes = list() 
    _iter_index = 0 
    _subscribers = list() 

    def __init__(self, msg_id, msg_name, msg_dlc, msg_tx): 
     """ 
     Constructor. 
     """ 
     self._canID = msg_id 
     self._name = msg_name 
     self._dlc = msg_dlc 
     self._txNode = msg_tx 

    def __iter__(self): 
     """ 
     Defined to make the object iterable. 
     """ 
     self._iter_index = 0 
     return self 

    def __next__(self): 
     """ 
     Defines the next CANSignal object to be returned in an iteration. 
     """ 
     if self._iter_index == len(self._signals): 
      self._iter_index = 0 
      raise StopIteration 
     self._iter_index += 1 
     return self._signals[self._iter_index-1] 

    def AddSignal(self, signal): 
     """ 
     Takes a CANSignal object and adds it to the list of signals. 
     """ 
     self._signals += [signal] 
     return self 

    def Signals(self): 
     """ 
     Gets the signals in a CANMessage object. 
     """ 
     return self._signals 

    def SetComment(self, comment_str): 
     """ 
     Sets the Comment property for the CANMessage. 
     """ 
     self._comment = comment_str 

     return self 

    def CANID(self): 
     """ 
     Gets the message's CAN ID. 
     """ 
     return self._canID 

    def AddValue(self, value_tuple): 
     """ 
     Adds a enumerated value mapping to the appropriate signal. 
     """ 
     for signal in self: 
      if signal.Name() == value_tuple[0]: 
       signal.SetValues(value_tuple[2]) 
       break 
     return self 

    def AddAttribute(self, attr_tuple): 
     """ 
     Adds an attribute to the message. 
     """ 
     self._attributes.append(attr_tuple) 
     return self 

    def ResetSignals(self): 
     """ 
     Flushes all the signals from the CANMessage object. 
     """ 
     self._signals = [] 
     return self 

    def ResetAttributes(self): 
     """ 
     Flushes all the attributes from the CANMessage object. 
     """ 
     self._attributes = [] 
     return self 

    def Name(self): 
     return self._name 

    def TransmittingNode(self): 
     return self._txNode 

    def DLC(self): 
     return self._dlc 
+0

'CANMessage'オブジェクトの完全な定義を示してください。私はいくつかの可能性について考えることができますが、何が起こっているのかをさらに詳しく知ることはできません。 – cco

+0

'CANMessage'の完全ソースで編集しました。 –

答えて

0

あなたはクラスの属性の代わりに、インスタンスの属性を使用するので、あなたが見ている問題があります。クラスのスコープから__init__に渡されない属性の初期化を__init__に移動すると、各インスタンスは独自のリストセットを持ちます。ここ
は、それがどのように見えるかです:

class CANMessage: 
    """ 
    Contains information on a message's ID, length in bytes, transmitting node, 
    and the signals it contains. 
    """ 

    def __init__(self, msg_id, msg_name, msg_dlc, msg_tx): 
     """ 
     Constructor. 
     """ 
     self._canID = msg_id 
     self._name = msg_name 
     self._dlc = msg_dlc 
     self._txNode = msg_tx 
     self._name = "" 
     self._canID = None 
     self._idType = None 
     self._dlc = 0 
     self._txNode = "" 
     self._comment = "" 
     self._signals = list() 
     self._attributes = list() 
     self._iter_index = 0 
     self._subscribers = list() 

    # the rest of the class is unchanged, and not repeated here... 
+0

これはトリックでした!ありがとう、私はそのような区別があることを知らなかった。 –

関連する問題