attrdict.py revision 12563:8d59ed22ae79
12SN/A# Copyright (c) 2006 The Regents of The University of Michigan 210676Sandreas.hansson@arm.com# All rights reserved. 39235Sandreas.hansson@arm.com# 49235Sandreas.hansson@arm.com# Redistribution and use in source and binary forms, with or without 59235Sandreas.hansson@arm.com# modification, are permitted provided that the following conditions are 69235Sandreas.hansson@arm.com# met: redistributions of source code must retain the above copyright 79235Sandreas.hansson@arm.com# notice, this list of conditions and the following disclaimer; 89235Sandreas.hansson@arm.com# redistributions in binary form must reproduce the above copyright 99235Sandreas.hansson@arm.com# notice, this list of conditions and the following disclaimer in the 109235Sandreas.hansson@arm.com# documentation and/or other materials provided with the distribution; 119235Sandreas.hansson@arm.com# neither the name of the copyright holders nor the names of its 129235Sandreas.hansson@arm.com# contributors may be used to endorse or promote products derived from 139235Sandreas.hansson@arm.com# this software without specific prior written permission. 141762SN/A# 152SN/A# THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS 162SN/A# "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT 172SN/A# LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR 182SN/A# A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT 192SN/A# OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, 202SN/A# SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT 212SN/A# LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, 222SN/A# DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY 232SN/A# THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT 242SN/A# (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE 252SN/A# OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. 262SN/A# 272SN/A# Authors: Nathan Binkert 282SN/A 292SN/Afrom __future__ import print_function 302SN/A 312SN/A__all__ = [ 'attrdict', 'multiattrdict', 'optiondict' ] 322SN/A 332SN/Aclass attrdict(dict): 342SN/A """Wrap dict, so you can use attribute access to get/set elements""" 352SN/A def __getattr__(self, attr): 362SN/A if attr in self: 372SN/A return self.__getitem__(attr) 382SN/A return super(attrdict, self).__getattribute__(attr) 392665SN/A 402665SN/A def __setattr__(self, attr, value): 412665SN/A if attr in dir(self) or attr.startswith('_'): 429235Sandreas.hansson@arm.com return super(attrdict, self).__setattr__(attr, value) 432SN/A return self.__setitem__(attr, value) 442SN/A 459235Sandreas.hansson@arm.com def __delattr__(self, attr): 469235Sandreas.hansson@arm.com if attr in self: 472SN/A return self.__delitem__(attr) 4810481Sandreas.hansson@arm.com return super(attrdict, self).__delattr__(attr) 499412Sandreas.hansson@arm.com 509412Sandreas.hansson@arm.com def __getstate__(self): 519411Sandreas.hansson@arm.com return dict(self) 529405Sandreas.hansson@arm.com 539411Sandreas.hansson@arm.com def __setstate__(self, state): 549235Sandreas.hansson@arm.com self.update(state) 559235Sandreas.hansson@arm.com 5610676Sandreas.hansson@arm.comclass multiattrdict(attrdict): 5710676Sandreas.hansson@arm.com """Wrap attrdict so that nested attribute accesses automatically create 5810676Sandreas.hansson@arm.com nested dictionaries.""" 5910676Sandreas.hansson@arm.com def __getattr__(self, attr): 6010676Sandreas.hansson@arm.com try: 6110676Sandreas.hansson@arm.com return super(multiattrdict, self).__getattr__(attr) 6210676Sandreas.hansson@arm.com except AttributeError: 6310676Sandreas.hansson@arm.com if attr.startswith('_'): 6410676Sandreas.hansson@arm.com raise 6510676Sandreas.hansson@arm.com 6610676Sandreas.hansson@arm.com d = multiattrdict() 6710676Sandreas.hansson@arm.com setattr(self, attr, d) 6810676Sandreas.hansson@arm.com return d 6910676Sandreas.hansson@arm.com 7010676Sandreas.hansson@arm.comclass optiondict(attrdict): 7110676Sandreas.hansson@arm.com """Modify attrdict so that a missing attribute just returns None""" 729235Sandreas.hansson@arm.com def __getattr__(self, attr): 732SN/A try: 742SN/A return super(optiondict, self).__getattr__(attr) 759405Sandreas.hansson@arm.com except AttributeError: 769405Sandreas.hansson@arm.com return None 779411Sandreas.hansson@arm.com 7810435Snilay@cs.wisc.eduif __name__ == '__main__': 799405Sandreas.hansson@arm.com x = attrdict() 809405Sandreas.hansson@arm.com x.y = 1 819405Sandreas.hansson@arm.com x['z'] = 2 829411Sandreas.hansson@arm.com print(x['y'], x.y) 839411Sandreas.hansson@arm.com print(x['z'], x.z) 849411Sandreas.hansson@arm.com print(dir(x)) 8510676Sandreas.hansson@arm.com print(x) 8610676Sandreas.hansson@arm.com 8710676Sandreas.hansson@arm.com print() 8810676Sandreas.hansson@arm.com 899411Sandreas.hansson@arm.com del x['y'] 909411Sandreas.hansson@arm.com del x.z 919411Sandreas.hansson@arm.com print(dir(x)) 929411Sandreas.hansson@arm.com print(x) 939411Sandreas.hansson@arm.com 949411Sandreas.hansson@arm.com print() 959411Sandreas.hansson@arm.com print("multiattrdict") 969235Sandreas.hansson@arm.com x = multiattrdict() 972SN/A x.x.x.x = 9 989235Sandreas.hansson@arm.com x.y.z = 9 9910676Sandreas.hansson@arm.com print(x) 10010676Sandreas.hansson@arm.com print(x.y) 1019411Sandreas.hansson@arm.com print(x.y.z) 1029411Sandreas.hansson@arm.com print(x.z.z) 1039411Sandreas.hansson@arm.com