Re: [PLUG] Python nested dict data structure

JP Vossen via plug on 10 Jul 2021 12:12:11 -0700


[Date Prev] [Date Next] [Thread Prev] [Thread Next] [Date Index] [Thread Index]

Re: [PLUG] Python nested dict data structure


On 7/10/21 1:22 PM, gary@duzan.org wrote:
Adding "import numbers" on a line before "class PerlObject:" should do it.
Duh. Thank you, yes, that works.
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	import json # But doesn't work because PerlObject() isn't JSON serializable
 7	import numbers
 8	
 9	class PerlObject:
 10	
 11	 def __init__(self, value=None):
 12	 self.Value = value
 13	
 14	 def __getitem__(self, key):
 15	 self.checkType(dict)
 16	 if key not in self.Value:
 17	 self.Value[key] = PerlObject()
 18	 return self.Value[key]
 19	
 20	 def __setitem__(self, key, value):
 21	 self.checkType(dict)
 22	 if isinstance(value, PerlObject):
 23	 self.Value[key] = value
 24	 else:
 25	 self.Value[key] = PerlObject(value)
 26	
 27	 def __delitem__(self, key):
 28	 self.checkType(dict)
 29	 if key in self.Value:
 30	 del self.Value[key]
 31	
 32	 def __add__(self, other):
 33	 self.checkType(numbers.Number, 0)
 34	 if isinstance(other, PerlObject):
 35	 other.checkType(numbers.Number, 0)
 36	 return PerlObject(self.Value + other.Value)
 37	 return PerlObject(self.Value + other)
 38	
 39	 def checkType(self, t, dfv=None):
 40	 if self.Value == None:
 41	 if dfv != None:
 42	 self.Value = dfv
 43	 else:
 44	 self.Value = t()
 45	 elif not isinstance(self.Value, t):
 46	 raise Exception("Object does not support operation")
 47	
 48	 def __repr__(self):
 49	 return str(self)
 50	
 51	 def __str__(self):
 52	 return str(self.Value)
 53	
 54	d = PerlObject()
 55	
 56	# Main
 57	company = 'Acme Inc' # Key in both (all) files
 58	
 59	# First read file 1, containing: Company\tRegion\tOther-stuff-I-don't-care-about-here
 60	d[company]['region'] = 'US'
 61	
 62	# ...LATER...read file 2, containing *multiple records* of: Company\tthis\tthat\Counter
 63	d[company]['counter'] += 2
 64	d[company]['counter'] += 3
 65	
 66	# ...STILL LATER...read file 3, containing even more crazy stuff
 67	d[company]['subkey']['subsubkey'] = 'foo'
 68	d[company]['subkey']['subsubint'] += 6
 69	
 70	print(d)
 71	#TypeError: Object of type 'PerlObject' is not JSON serializable
 72	#print(json.dumps(d, indent=2, sort_keys=True)) # Pretty but needs: import json
```
Output:
```
$ ./dict3.py
{'Acme Inc': {'region': US, 'counter': 5, 'subkey': {'subsubkey': foo, 'subsubint': 6}}}
```
If I try to `print(json.dumps(...` I get this:
```
$ ./dict3.py
Traceback (most recent call last):
 File "./dict3.py", line 71, in <module>
 print(json.dumps(d, indent=2, sort_keys=True)) # Pretty but needs: import json
 File "/usr/lib/python3.6/json/__init__.py", line 238, in dumps
 **kw).encode(obj)
 File "/usr/lib/python3.6/json/encoder.py", line 201, in encode
 chunks = list(chunks)
 File "/usr/lib/python3.6/json/encoder.py", line 437, in _iterencode
 o = _default(o)
 File "/usr/lib/python3.6/json/encoder.py", line 180, in default
 o.__class__.__name__)
TypeError: Object of type 'PerlObject' is not JSON serializable
```
Which makes sense because as Luke already said, "[the class is] pretty limited in functionality so far since I made it specifically for this example."
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

AltStyle によって変換されたページ (->オリジナル) /