On Thu, Aug 30, 2018 at 8:31 PM James Lu <jam...@gmail.com> wrote: > Why shouldn't Python be better at implementing Domain Specific Languages? > > [snip] > > It would be nice if there was a DSL for describing neural networks (Keras). > The current syntax looks like this: > > model.add(Dense(units=64, activation='relu', input_dim=100)) > model.add(Dense(units=10, activation='softmax')) > > How about something like this?
with model: with Dense() as dense: dense.units = 64 dense.activation = 'relu' dense.input_dim = 100 with Dense() as dense: dense.units = 10 dense.activation = 'softmax' The `with` creates a context to which subsequent layers are added when created within the context. But it does suffer from the fact that the `with` object's (or the underlying stack that would implement this in the model/layers) scope is not local to the function, so if within the `with` context you call a function that creates a layer, the layer will be added to the caller's context, which would be surprising. I was working on a similar approach for a python GUI, and `with` seemed like a very nice candidate, but ran into this issue, which didn't seem to have a clean fix. I also thought about using an decorator that pre-processes the AST for a GUI description, which for your example would look like something like: with model: with Dense(): units = 64 activation = 'relu' input_dim = 100 with Dense(): units = 10 activation = 'softmax' But here the issues are (a) the similarity with local variables may be confusing (b) you'd need to either make all `with` statements special, or annotate the `with` statements that are going to be processed by the compiler (e.g. by prefixing the object with a dash). It seemed messy enough that I'm still pondering this. Matt
_______________________________________________ Python-ideas mailing list Python-ideas@python.org https://mail.python.org/mailman/listinfo/python-ideas Code of Conduct: http://python.org/psf/codeofconduct/