This use case is nicely covered by short form for keyword arguments. So in this case instead of plot(x, z), we'd have plot(=x, =z) which would be transformed into plot(**{'x': x, 'z': z}) at compile time. This could work for any expression:
foo(=lamda x: x*2) -> foo(**{'lamda x: x*2': lamda x: x*2}) This feature is easy to implement and has broad applications. > On 13 Jul 2019, at 21:16, Nima Hamidi <ham...@stanford.edu> wrote: > > Hello all, > > I would like to briefly share my thoughts on non-standard evaluation (NSE), > why this is useful, and how, potentially, it can be added to Python. In most > languages, functions have access only to the value of their arguments, and > not to the expressions that yielded those values. However, sometimes it is > useful to have access to the expressions as well. For example, let plot(x, y, > ...) be a function that draws the scatter plot of y against x and adds labels > for the x- and y-axes. Currently, there is no way to distinguish plot(x, z, > ...) from plot(x, y, ...) from within the function. As such, one needs to > pass the names of the variables to the plot function to be used as the axes' > labels. Using NSE, though, the function can look at the expressions in the > method call and use those as the default value for labels. In R, this idea is > used widely to make the syntax simpler. > > In the following, I sketch how I think this can be implemented: > Let BoundExpression be a class containing an ast.Expression as well as locals > and globals dictionaries. BoundExpression can also have an eval method that > evaluates its expression using its locals and globals dictionaries. > Let `x` be the short form for BoundExpression("x", locals(), globals()). > Then, the plot function can be implemented in a way that plot(`x`, `y`) draws > scatter plot of x and y and also, labels the axes correctly. No need to > provide labels explicitly anymore. > A more challenging idea is to let developers decide whether their functions > need NSE or not. For example, when a function is defined as def f(`x`), for > any method call like f(x), the first argument should be wrapped with a > BoundExpression instance. > I would appreciate any feedback on these ideas. > > Best, > Nima > > _______________________________________________ > Python-ideas mailing list -- python-ideas@python.org > To unsubscribe send an email to python-ideas-le...@python.org > https://mail.python.org/mailman3/lists/python-ideas.python.org/ > Message archived at > https://mail.python.org/archives/list/python-ideas@python.org/message/QE5OTQSEQHBBWWAQVIA66YUKGK5M6QDL/ > Code of Conduct: http://python.org/psf/codeofconduct/
_______________________________________________ Python-ideas mailing list -- python-ideas@python.org To unsubscribe send an email to python-ideas-le...@python.org https://mail.python.org/mailman3/lists/python-ideas.python.org/ Message archived at https://mail.python.org/archives/list/python-ideas@python.org/message/JMT2VY6GMJTPWU4V2SII2C4Y6EUVEJSQ/ Code of Conduct: http://python.org/psf/codeofconduct/