From ca66ed7e36efe9ca6451f6c83bec41b57c345289 Mon Sep 17 00:00:00 2001 From: Darren Ranalli Date: Thu, 6 Jul 2006 02:23:42 +0000 Subject: [PATCH] non-lossy invertDict, fixed fastRepr already-visited logic --- direct/src/showbase/PythonUtil.py | 16 ++++++++++++---- 1 file changed, 12 insertions(+), 4 deletions(-) diff --git a/direct/src/showbase/PythonUtil.py b/direct/src/showbase/PythonUtil.py index 91111a7e17..f047d87a5a 100644 --- a/direct/src/showbase/PythonUtil.py +++ b/direct/src/showbase/PythonUtil.py @@ -549,10 +549,10 @@ def list2dict(L, value=None): """creates dict using elements of list, all assigned to same value""" return dict([(k, value) for k in L]) -def invertDict(D): +def invertDict(D, lossy=False): """creates a dictionary by 'inverting' D; keys are placed in the new dictionary under their corresponding value in the old dictionary. - Data will be lost if D contains any duplicate values. + It is an error if D contains any duplicate values. >>> old = {'key1':1, 'key2':2} >>> invertDict(old) @@ -560,6 +560,8 @@ def invertDict(D): """ n = {} for key, value in D.items(): + if not lossy and value in n: + raise 'duplicate key in invertDict: %s' % value n[value] = key return n @@ -2006,7 +2008,6 @@ def fastRepr(obj, maxLen=200, strFactor=10, _visitedIds=None): _visitedIds = set() if id(obj) in _visitedIds: return '' % itype(obj) - _visitedIds.add(id(obj)) if type(obj) in (types.TupleType, types.ListType): s = '' s += {types.TupleType: '(', @@ -2017,9 +2018,11 @@ def fastRepr(obj, maxLen=200, strFactor=10, _visitedIds=None): else: o = obj ellips = '' + _visitedIds.add(id(obj)) for item in o: s += fastRepr(item, maxLen, _visitedIds=_visitedIds) s += ', ' + _visitedIds.remove(id(obj)) s += ellips s += {types.TupleType: ')', types.ListType: ']',}[type(obj)] @@ -2028,13 +2031,18 @@ def fastRepr(obj, maxLen=200, strFactor=10, _visitedIds=None): s = '{' if len(obj) > maxLen: o = obj.keys()[:maxLen] + ellips = '...' else: o = obj.keys() + ellips = '' + _visitedIds.add(id(obj)) for key in o: value = obj[key] s += '%s: %s, ' % (fastRepr(key, maxLen, _visitedIds=_visitedIds), fastRepr(value, maxLen, _visitedIds=_visitedIds)) - s += '...}' + _visitedIds.remove(id(obj)) + s += ellips + s += '}' return s elif type(obj) is types.StringType: maxLen *= strFactor