root/gaphor/tags/gaphor-0.12.0/gaphor/misc/rattr.py

Revision 1270, 1.2 kB (checked in by wrobe..@pld-linux.org, 2 years ago)

- moved gaphor.util to gaphor.misc.rattr

Line 
1 """
2 Recursive attribute access functions.
3 """
4
5 def rgetattr(obj, attr):
6     """
7     Get named attribute from an object, i.e. getattr(obj, 'a.a') is
8     equivalent to ``obj.a.a''.
9
10      - obj:  object
11      - attr: attribute name(s)
12
13     >>> class A(object): pass
14     >>> a = A()
15     >>> a.a = A()
16     >>> a.a.a = 1
17     >>> rgetattr(a, 'a.a')
18     1
19     >>> rgetattr(a, 'a.c')
20     Traceback (most recent call last):
21     ...
22     AttributeError: 'A' object has no attribute 'c'
23     """
24     attrs = attr.split('.')
25     obj = getattr(obj, attrs[0])
26     for name in attrs[1:]:
27         obj = getattr(obj, name)
28     return obj
29
30
31 def rsetattr(obj, attr, val):
32     """
33     Set named attribute value on an object, i.e. setattr(obj, 'a.a', 1)
34     is equivalent to ``obj.a.a = 1''.
35
36      - obj:  object
37      - attr: attribute name(s)
38      - val:  attribute value
39
40     >>> class A(object): pass
41     >>> a = A()
42     >>> a.a = A()
43     >>> a.a.a = 1
44     >>> rsetattr(a, 'a.a', 2)
45     >>> print a.a.a
46     2
47     >>> rsetattr(a, 'a.c', 3)
48     >>> print a.a.c
49     3
50     """
51     attrs = attr.split('.')
52     if len(attrs) > 1:
53         obj = getattr(obj, attrs[0])
54         for name in attrs[1:-1]:
55             obj = getattr(obj, name)
56     setattr(obj, attrs[-1], val)
57
58
59 # vim:sw=4:et:ai
Note: See TracBrowser for help on using the browser.