| 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