Dynamically create classes for spark-parser-framework
Peter Otten
__peter__ at web.de
Mon Dec 15 14:59:40 EST 2003
Diez B. Roggisch wrote:
> I've got to create some spark-based parsers during runtime. For people not
> familiar with spark, a parser looks like this:
>
> class MixFixParser(spark.GenericParser):
> def __init__(self, start='p_start'):
> spark.GenericParser.__init__(self, start)
>
> def p_rules(_, args):
> """
> p_start ::= p_op p_start
> p_start ::=
> p_op ::= p_start lbracket p_start rbracket
> """
> return args
>
> The framework looks for methods beginning with p_ and inspects its
> docstring for grammar rules.
>
> I hope that the body of my p_rules will be uniform, so until now I'd like
> to have one paser baseclass like MixFixParser above, and then modify the
> docstring accordingly - only for one specified instance!
>
> My first attempts failed due to
>
> AttributeError: 'instancemethod' object attribute '__doc__' is read-only
If a writable __doc__ really is sufficient (which I doubt, while I know
nothing about spark):
>>> class T:
... def demo(self, x):
... print "demo(%r)" % x
...
>>> class Method:
... def __init__(self, func):
... self.func = func
... def __call__(self, *args):
... self.func(*args)
...
>>> t = T()
>>> t.demo = Method(t.demo)
>>> t.demo.__doc__ = "so what"
>>> t.demo.__doc__
'so what'
>>> t.demo("abc")
demo('abc')
>>> t.demo.__doc__ = "something else"
>>> t.demo.__doc__
'something else'
Maybe you can expand on this, e. g. doing self.method = Method(self.method)
for every method starting with "p_" in the constructor.
Peter
More information about the Python-list
mailing list