From: Felix W. <Fel...@gm...> - 2006-03-11 01:08:27
|
go...@us... wrote: > + # !!! Class attribute conflicts with instance attribute self.options. > + # Change to option_spec? > options = None I'm not sure if a dictionary attribute is a good idea at all: Eventually we'll have to get common options like the "class" option "mixed-in" into the options, to avoid duplicating the option spec code and to provide helper methods. The only way to achieve this I can think of right now is using multiple inheritance, thus adding e.g. a "ClassOption" base class, which all directives that take a class option inherit from. In order to inherit options from base classes, it's probably best to use a method, get_option(), which can call its base classes' methods. [1]_ Thus, we'd specify the options like this:: class CSVTable(Directive, directives.ClassOption, directives.FileOrURIOption): def get_options(self): options = Directive.get_options(self) options.update(directives.ClassOption.get_options(self)) options.update(directives.FileOrURIOption.get_options(self)) options['alt'] = directives.unchanged ... return options OK. I admit it. It looks horrible and redundant. Maybe we should use some magic to inherit options, in order to avoid all that pull-data-from-base-class cruft? Suggestions please. .. [1] (If you are already convinced that using a get_options method is a good idea, you can skip this footnote.) Another advantage of using a method is that we can get polymorphism by using self. E.g., the image directive would say: class Image(Directive): align_values = ['top', 'middle', 'bottom', 'left', 'center', 'right'] def align(self, argument): return directives.choice(argument, self.align_values) def get_options(self): return {'align': self.align, ...} class Figure(Directive): align_values = ['top', 'middle', 'bottom'] Note that only because of the binding of self at run-time, it's possible that the align() method picks up Figure's align_value attribute. Of course, if we had to declare the option spec at declaration time (i.e. "options = ..."), we could just declare a new align() method for the Figure directive. However, by creating the option at run time using get_options, we gain a bit of flexibility, which allows us to re-use the Image's align() method. Oooh, this is complicated. -- For private mail please ensure that the header contains 'Felix Wiemann'. "the number of contributors [...] is strongly and inversely correlated with the number of hoops each project makes a contributing user go through." -- ESR |
From: David G. <go...@py...> - 2006-03-11 01:34:09
Attachments:
signature.asc
|
[Felix Wiemann] > go...@us... wrote: >> + # !!! Class attribute conflicts with instance attribute self.opti= ons. >> + # Change to option_spec? >> options =3D None >=20 > I'm not sure if a dictionary attribute is a good idea at all: Perhaps, perhaps not. Regardless, there's a conflict there. Fixed now; I renamed it to option_spec. > Eventually we'll have to get common options like the "class" option > "mixed-in" into the options, to avoid duplicating the option spec code > and to provide helper methods. The only way to achieve this I can thin= k > of right now is using multiple inheritance, thus adding e.g. a > "ClassOption" base class, which all directives that take a class option= > inherit from. Sounds good. > In order to inherit options from base classes, it's probably best to us= e > a method, get_option(), which can call its base classes' methods. [1]_ >=20 > Thus, we'd specify the options like this:: >=20 > class CSVTable(Directive, > directives.ClassOption, directives.FileOrURIOption):= >=20 > def get_options(self): > options =3D Directive.get_options(self) > options.update(directives.ClassOption.get_options(self)) > options.update(directives.FileOrURIOption.get_options(self)= ) > options['alt'] =3D directives.unchanged > ... > return options >=20 > OK. I admit it. It looks horrible and redundant. I'm sure we can come up with an elegant solution :-) I don't have time right now to work on it though :-( > Oooh, this is complicated. Exercise for the brain. --=20 David Goodger <http://python.net/~goodger> |