The code fragment below shows what appears to be inconsistent behaviour. The code is testing that messages are created correctly and that an instances of a class is created correctly. It checks that all of the expected addresses are used (contained in addresslist) and that all of the messages are used (contained in msglist). If the data in msglist that appears in the list in the dictionary whose first key is 'Sonar Main' is a simple list of two items the test behaves as expected and passes. However, if the data is enclosed within a tuple such that the list only contains the tuple, which contains the two values, the test fails. The first of these two values is a class object and the code tests whether the instance of this class is created correctly locally and that test is passed in both cases. The test fails because the msglist item for 'Sonar Main' is not deleted. I have included an example of the 'Sonar Main' data and also the test output. I can not explain this behaviour and while it is not a showstopper I need to understand why. The same behaviour is shown elsewhere if a list of four items is grouped into two tuples each of two items. Grateful for any comments/explanations.
CODE FRAGMENT: msglist = [{'Helm': {'init': (80, 80, 0, 12, 140, 20)}}, {'UAW Director': {'init': (80, 80, 0, 12, 140, 20), 'sonar_a': ['std'], 'sub_attack': ['std']}}, {'Gun Director': {'guns_s': ['std'], 'init': (80, 80, 0, 12, 140, 20), 'guns_mr': ['std'], 'guns_aa': ['std']}}, {'Sonar Main': {'sonar_s': [DummySonar, 0]}}, {'Surface Radar Operator': {'radar_s': ['std']}}] addresslist = ['127.10.2.2', '127.10.2.1', '127.10.2.5', '127.10.2.4', '127.10.2.3'] for entry in msgs: if entry[1] in addresslist: addresslist.remove(entry[1]) if entry[0]['set role'] in msglist: if entry[0]['set role'].keys() == ['Sonar Main']: print 'keys = ', entry[0]['set role'].keys() if not isinstance(self.newprocessor.vessel.uwsearch.sonar_search, shipserverclasses.DummySonar): Pass = False print '1', type(self.newprocessor.vessel.uwsearch.sonar_search) print 'removing msg ', entry[0]['set role'] msglist.remove(entry[0]['set role']) else: print 'removing msg ', entry[0]['set role'] msglist.remove(entry[0]['set role']) if addresslist != []: Pass = False print '2', addresslist if msglist != []: Pass = False print '3', msglist self.failUnless(Pass == True) ------------------------------------------------------------------------------------------------ Data fragment - passed: {'Sonar Main': {'sonar_s': [DummySonar, 0]}} Test Output: testAllConnectedUWsearchChange2 (__main__.TestMsgProcessesShipServerSetType) ... removing msg {'Helm': {'init': (80, 80, 0, 12, 140, 20)}} removing msg {'UAW Director': {'init': (80, 80, 0, 12, 140, 20), 'sonar_a': ['s td'], 'sub_attack': ['std']}} keys = ['Sonar Main'] removing msg {'Sonar Main': {'sonar_s': [<class 'shipserverclasses.DummySonar'> , 0]}} removing msg {'Gun Director': {'guns_s': ['std'], 'init': (80, 80, 0, 12, 140, 20), 'guns_mr': ['std'], 'guns_aa': ['std']}} removing msg {'Surface Radar Operator': {'radar_s': ['std']}} ok ------------------------------------------------------------------------------------------------------ Data fragment - failed: {'Sonar Main': {'sonar_s': [(DummySonar, 0)]}} Test Output: testAllConnectedUWsearchChange2 (__main__.TestMsgProcessesShipServerSetType) ... removing msg {'Helm': {'init': (80, 80, 0, 12, 140, 20)}} removing msg {'UAW Director': {'init': (80, 80, 0, 12, 140, 20), 'sonar_a': ['s td'], 'sub_attack': ['std']}} removing msg {'Gun Director': {'guns_s': ['std'], 'init': (80, 80, 0, 12, 140, 20), 'guns_mr': ['std'], 'guns_aa': ['std']}} removing msg {'Surface Radar Operator': {'radar_s': ['std']}} 3 [{'Sonar Main': {'sonar_s': [(<class 'shipserverclasses.DummySonar'>, 0)]}}] FAIL -- http://mail.python.org/mailman/listinfo/python-list