Hi,
I wrote some code some time ago. The code also checks the differences
between two states of an object.
The first part is similar to yours, it's also a recursive function, but
it creates a dict and you can use a level to stop searching, so you
won't get an infinite cycle.
The second part - I think, I used some code from stackoverflow -
compares two nested dicts with each other and prints out the results.
It works best inside of an extension, where you can keep objects alive.
so it would be:
level = 2
self.res1 = get_attribs(object,level )
#do something
# and start the function again with:
self.res2 = get_attribs(object,level )
findDiff(self.res1, self.res2)
Regards,
Xaver
Here's the code:
ctx = uno.getComponentContext()
smgr = ctx.ServiceManager
desktop = smgr.createInstanceWithContext( "com.sun.star.frame.Desktop",ctx)
doc = desktop.getCurrentComponent()
current_Contr = doc.CurrentController
viewcursor = current_Contr.ViewCursor
object = doc
max_lvl = 3
def get_attribs(obj,lvl):
results = {}
for key in dir(obj):
try:
value = getattr(obj, key)
if 'callable' in str(type(value)):
continue
except :
#print(key)
continue
if key not in results:
if type(value) in (
type(None),
type(True),
type(1),
type(.1),
type('string'),
type(()),
type([]),
type(b''),
type(r''),
type(u'')
):
results.update({key: value})
elif lvl < max_lvl:
try:
results.update({key: get_attribs(value,lvl+1)})
except:
pass
return results
diff = []
def findDiff(d1, d2, path=""):
for k in d1.keys():
if not d2.has_key(k):
print path, ":"
print k + " as key not in d2", "\n"
else:
if type(d1[k]) is dict:
if path == "":
path = k
else:
path = path + "->" + k
findDiff(d1[k],d2[k], path)
else:
if d1[k] != d2[k]:
diff.append((path,k,d1[k],d2[k]))
path = ''
res1 = get_attribs(object,1)
viewcursor.gotoEnd(False)
viewcursor.setString('Test ')
res2 = get_attribs(object,1)
findDiff(res1, res2)
for d in diff:
print(d)
time.sleep(.4)
Am 22.08.2015 um 20:24 schrieb Piet van Oostrum:
Hi-Angel wrote:
> Okay, I wrote a python code that explores every property, and doesn't
> fall into an infinite cycle. It is
> [...]
> However it produces too much output, e.g. from a test document it
> produced 1gb of output. I think the problem is that most elements
> still appears in output many times — the check that in backtrace
> wasn't the current element is ensures only that it wouldn't fall in an
> infinite cycle.
You can get an infinite cycle at any level, so only checking at the top level
is not good enough. You will have to check at each node.
--
To unsubscribe e-mail to: users+unsubscr...@global.libreoffice.org
Problems? http://www.libreoffice.org/get-help/mailing-lists/how-to-unsubscribe/
Posting guidelines + more: http://wiki.documentfoundation.org/Netiquette
List archive: http://listarchives.libreoffice.org/global/users/
All messages sent to this list will be publicly archived and cannot be deleted