1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24 """\
25 Pythonize FIFE
26
27 Import this extension to get a more
28 pythonic interface to FIFE.
29
30 Currently it implements the following
31 conveniences:
32
33 * FIFE Exceptions print their message.
34 * Automatic property generation for:
35 * fife.Engine
36 * fife.Instance
37 * fife.Image
38 * fife.Animation
39 * fife.Point
40 * fife.Rect
41
42 """
43
44 from fife import fife
45 import re
46
47 __all__ = ()
48
49 fife.Exception.__str__ = fife.Exception.what
51 return 'Color(%s)' % ','.join(map(str,(c.r,c.g,c.b,c.a)))
52 fife.Color.__str__ = _Color2Str
53
54 classes = [ fife.Engine, fife.Instance, fife.Point, fife.Rect, fife.Image, fife.Animation,
55 fife.RenderBackend, fife.Event, fife.Command, fife.Container ]
56
58 """ Autocreate properties for getXYZ/setXYZ functions.
59 """
60 try:
61 import inspect
62 getargspec = inspect.getargspec
63 except ImportError:
64 print "Pythonize: inspect not available - properties are generated with dummy argspec."
65 getargspec = lambda func : ([],'args',None,None)
66
67 def isSimpleGetter(func):
68 if not callable(func):
69 return False
70 try:
71 argspec = getargspec(func)
72 return not (argspec[0] or [s for s in argspec[2:] if s])
73 except TypeError, e:
74
75 return False
76
77 def createNames(name):
78 for prefix in ('get', 'is', 'are'):
79 if name.startswith(prefix):
80 new_name = name[len(prefix):]
81 break
82 settername = 'set' + new_name
83 propertyname = new_name[0].lower() + new_name[1:]
84 return settername, propertyname
85
86 getter = re.compile(r"^(get|are|is)[A-Z]")
87 for class_ in classes:
88 methods = [(name,attr) for name,attr in class_.__dict__.items()
89 if isSimpleGetter(attr) ]
90 setmethods = [(name,attr) for name,attr in class_.__dict__.items() if callable(attr)]
91 getters = []
92 for name,method in methods:
93 if getter.match(name):
94 getters.append((name,method))
95 settername, propertyname = createNames(name)
96 setter = dict(setmethods).get(settername,None)
97
98 setattr(class_,propertyname,property(method,setter))
99 if not getters: continue
100
101
102
103 class_._property_names = set([name for name,method in getters])
104 def _setattr_wrapper_(self,*args):
105 if name in class_._property_names:
106 object.__setattr__(self,*args)
107 else:
108 class_.__setattr__(self,*args)
109 class_.__setattr__ = _setattr_wrapper_
110
111 createProperties()
112