私は現在、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
:
ここでは、ファイルのいくつかの関連部分をですか?私はそれをNone
IDispose
のようなインターフェイスを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
'CANMessage'オブジェクトの完全な定義を示してください。私はいくつかの可能性について考えることができますが、何が起こっているのかをさらに詳しく知ることはできません。 – cco
'CANMessage'の完全ソースで編集しました。 –