JP Vossen via plug on 10 Jul 2021 09:53:48 -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. 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 examplex = 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