Gary Duzan via plug on 10 Jul 2021 10:22:46 -0700 |
[Date Prev] [Date Next] [Thread Prev] [Thread Next] [Date Index] [Thread Index]
Re: [PLUG] Python nested dict data structure |
> Wow, that *would* work like Perl! But 40+ lines to make it Just Work. > > Also, I'm getting an error I don't understand. Adding "import numbers" on a line before "class PerlObject:" should do it. Gary Duzan > Modified code: > ``` > 1 #!/usr/bin/env python3 > 2 # dict3.py--do I REALLY have to build a CLASS just for NESTED > dicts!? > 3 # 2021-07-10 > 4 # From Luke Brooks in EM "Re: [PLUG] Python nested dict data > structure" > 5 > 6 class PerlObject: > 7 > 8 def __init__(self, value=None): > 9 self.Value = value > 10 > 11 def __getitem__(self, key): > 12 self.checkType(dict) > 13 if key not in self.Value: > 14 self.Value[key] = PerlObject() > 15 return self.Value[key] > 16 > 17 def __setitem__(self, key, value): > 18 self.checkType(dict) > 19 if isinstance(value, PerlObject): > 20 self.Value[key] = value > 21 else: > 22 self.Value[key] = PerlObject(value) > 23 > 24 def __delitem__(self, key): > 25 self.checkType(dict) > 26 if key in self.Value: > 27 del self.Value[key] > 28 > 29 def __add__(self, other): > 30 self.checkType(numbers.Number, 0) > 31 if isinstance(other, PerlObject): > 32 other.checkType(numbers.Number, 0) > 33 return PerlObject(self.Value + other.Value) > 34 return PerlObject(self.Value + other) > 35 > 36 def checkType(self, t, dfv=None): > 37 if self.Value == None: > 38 if dfv != None: > 39 self.Value = dfv > 40 else: > 41 self.Value = t() > 42 elif not isinstance(self.Value, t): > 43 raise Exception("Object does not support operation") > 44 > 45 def __repr__(self): > 46 return str(self) > 47 > 48 def __str__(self): > 49 return str(self.Value) > 50 > 51 d = PerlObject() > 52 > 53 # Main > 54 company = 'Acme Inc' # Key in both (all) files > 55 > 56 # First read file 1, containing: > Company\tRegion\tOther-stuff-I-don't-care-about-here > 57 d.company = 'US' > 58 > 59 # ...LATER...read file 2, containing *multiple records* of: > Company\tthis\tthat\Counter > 60 d[company]['counter'] += 2 > 61 d[company]['counter'] += 3 > 62 > 63 # ...STILL LATER...read file 3, containing even more crazy stuff > 64 d[company]['subkey']['subsubkey'] = 'foo' > 65 d[company]['subkey']['subsubint'] += 6 > 66 > 67 print(json.dumps(d, indent=2, sort_keys=True)) # Pretty but > needs: import json > ``` > > Output: > ``` > $ ./dict3.py > Traceback (most recent call last): > File "./dict3.py", line 60, in <module> > d[company]['counter'] += 2 > File "./dict3.py", line 30, in __add__ > self.checkType(numbers.Number, 0) > NameError: name 'numbers' is not defined > ``` > > > On 7/6/21 1:06 PM, Luke Brooks via plug wrote: >> This little class would do what you want although it's pretty limited in >> functionality so far since I made it specifically for this example >> >>>>> x = PerlObject() >>>>> company = 'Acme Inc' >>>>> x[company]['region'] = 'US' >>>>> x[company]['counter'] += 3 >>>>> x > > <snip> > > Thanks, > JP > -- ------------------------------------------------------------------- > JP Vossen, CISSP | http://www.jpsdomain.org/ | http://bashcookbook.com/ > ___________________________________________________________________________ > Philadelphia Linux Users Group -- > http://www.phillylinux.org > Announcements - > http://lists.phillylinux.org/mailman/listinfo/plug-announce > General Discussion -- > http://lists.phillylinux.org/mailman/listinfo/plug > ___________________________________________________________________________ Philadelphia Linux Users Group -- http://www.phillylinux.org Announcements - http://lists.phillylinux.org/mailman/listinfo/plug-announce General Discussion -- http://lists.phillylinux.org/mailman/listinfo/plug