in der Funktion foo2() erhalte ich ein fuer mich nicht erwartetes Ergebnis.
Das ausfuehren von oldDict['updated'] = time.time() fuehrt zu dem Ergebnis,
welches sich das Ergebnis von d.changed() ebenfalls aendert.
In der Funktion foo1 ist das nicht der Fall.
Was veranlasst Python dazu, das Ergebnis von d.changed() in foo2 zu aktualisieren und in foo1 nicht ???
vielen Dank für Eure Hilfe.
Code: Alles auswählen
#!/usr/bin/env python
# -*- coding: utf8 -*-
import time
class DictDifferences(object):
# http://stackoverflow.com/questions/1165352/
# fast-comparison-between-two-python-dictionary
"""
Differences between two dictionaries as:
(1) items added
(2) items removed
(3) keys same in both but changed values
(4) keys same in both and unchanged values
"""
def __init__(self, current_dict, past_dict):
self.current_dict = current_dict
self.past_dict = past_dict
self.set_current = set(current_dict.keys())
self.set_past = set(past_dict.keys())
self.intersect = self.set_current.intersection(self.set_past)
def added(self):
return self.set_current - self.intersect
def removed(self):
return self.set_past - self.intersect
def changed(self):
return set(o for o in self.intersect
if self.past_dict[o] != self.current_dict[o])
def unchanged(self):
return set(o for o in self.intersect
if self.past_dict[o] == self.current_dict[o])
def foo1():
old = { 'Name_1' : 'Maria',
'Name_2' : 'Schulze',
'Strasse': 'Hauptstr. 6',
'PLZ' : '12487',
'Ort' : 'Berlin',
'Land' : 'Deutschland',
'Telefon': '+49 30 333435',
'Mobile' : '+49 172 123456',
'updated': '' }
new = { 'Name_1' : 'Maria',
'Name_2' : 'Schulze',
'Strasse': 'Hauptstr. 6',
'PLZ' : '12487',
'Ort' : 'Berlin',
'Land' : 'Deutschland',
'Telefon': '+49 30 434445',
'Mobile' : '+49 172 123456',
'updated': '' }
# Nur der Key Telefon hat sich geaendert.
# - old = +49 30 333435
# - new = +49 30 434445
DictDiff = DictDifferences
d = DictDiff(new, old)
print d.changed()
# [OUT] set(['Telefon'])
old['update'] = time.time()
print d.changed()
# [OUT] set(['Telefon'])
def foo2():
old = { 'Personen' : [ { 'Name_1' : 'Maria',
'Name_2' : 'Schulze',
'Strasse': 'Hauptstr. 6',
'PLZ' : '12487',
'Ort' : 'Berlin',
'Land' : 'Deutschland',
'Telefon': '+49 30 333435',
'Mobile' : '+49 172 1234567',
'updated': '' },
{ 'Name_1' : 'Tom',
'Name_2' : 'Maier',
'Strasse': 'Karlstr. 57',
'PLZ' : '10243',
'Ort' : 'Berlin',
'Land' : 'Deutschland',
'Telefon': '+49 30 677565',
'Mobile' : '+49 172 9876543',
'updated': '' } ] }
new = { 'Personen' : [ { 'Name_1' : 'Maria',
'Name_2' : 'Schulze',
'Strasse': 'Hauptstr. 6',
'PLZ' : '12487',
'Ort' : 'Berlin',
'Land' : 'Deutschland',
'Telefon': '+49 30 434445',
'Mobile' : '+49 172 1234567',
'updated': '' },
{ 'Name_1' : 'Tom',
'Name_2' : 'Maier',
'Strasse': 'Karlstr. 57',
'PLZ' : '10243',
'Ort' : 'Berlin',
'Land' : 'Deutschland',
'Telefon': '+49 30 788664',
'Mobile' : '+49 172 9876543',
'updated': '' } ] }
# Nur der Key Telefon hat sich geaendert.
# - old = +49 30 333435 - new = +49 30 434445 (Maria)
# - old = +49 30 677565 - new = +49 30 788664 (Tom)
DictDiff = DictDifferences
for i,v in new.iteritems():
if i in old:
for newDict in v:
for oldDict in old[i]:
d = DictDiff(newDict, oldDict)
if d.unchanged().issuperset(set(['Name_1', 'Name_2'])):
print '1. d.changed() = {}'.format(d.changed())
# [OUT] 1. d.changed() = set(['Telefon']) !!!!!!!!!!
oldDict['updated'] = time.time()
print '2. d.changed() = {}'.format(d.changed())
# [OUT] 2. d.changed() = set(['updated', 'Telefon']) Warum ist das so ???????
if __name__ == '__main__':
print '\n=> foo1()'
foo1()
print '\n=> foo2()'
foo2()
print '\n=> Ende ....'