|
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 |
|
|---|