> On 14 Jul 2019, at 22:46, Andrew Barnert <abarn...@yahoo.com> wrote:
> 
>>> First, the function only gets the names, not live expressions that it can 
>>> eval late, or in a modified environment, etc., so it only handles this 
>>> case, not cases like df[year>1990].
>> 
>> I don't understand how it's not the full expression. It's the expression as 
>> a string but it's still the full code. 
> 
> But this doesn’t in any way help with late eval. The caller has already 
> evaluated the expression to pass the value of the keyword argument. The fact 
> that you could ignore that value and re-do the eval doesn’t help if the eval 
> would raise a NameError like the year>1990 case (or if it would do something 
> expensive or dangerous).

Ah. Now I'm with you. Yes this is different but it also seems strange that we 
wouldn't just use a lambda or a function for that. That's exactly why they 
exist. 

> Finally, while this is a less serious problem than the last two, the same 
> string isn’t guaranteed to compile to the same AST in two different contexts. 
> Consider how your proposal would play with libraries that insert token or AST 
> processors.

Hmm, well I've never seen one of those outside toy programs but I'll concede 
the point. 

> But in the case of plot(=lambda x:x*2, =lambda x:x**2), you’re saying that 
> the callee has a variable named lambda x:x*2, which is not true. What the 
> callee actually has is two unnamed positional arguments, each of which comes 
> with an extra string argument buried as its name.

I disagree. The callee has a thing called that, it just isn't a variable but a 
local expression. And in any kwargs have never meant that the caller has a 
variable by the name of the callee argument so why would it here?

> (The fact that they’re positional, but passed as if they were keyword, 
> accepted as if they were keyword, and then pulled out by iterating **kw in 
> order is also confusing.)

What is positional? Everything here is keyword. We must be talking past each 
other. My proposal is just a different short syntax for keyword arguments at 
the call site. 

> 
>>>> This could work for any expression:
>>>> 
>>>> foo(=lamda x: x*2) -> foo(**{'lamda x: x*2': lamda x: x*2})
>>> 
>>> Is this actually legal? The docs just say the contents of the ** mapping 
>>> are treated as additional keyword arguments. CPython happens to check that 
>>> they are strings but not check that those strings are valid keywords, but I 
>>> don’t think the language definition actually says this is the intended 
>>> behavior, it’s just an accident of the CPython implementation. So this 
>>> might require at least defining that implementation behavior as the only 
>>> correct one, and changing the docs to explain it.
>> 
>> You are correct. I have checked that this is the behavior of CPython, pypy, 
>> micropythob, iron python, and jython so shouldn't be a big burden. 
> 
> This might actually be a good change even on its own. The fact that the docs 
> aren’t clear on what can go in a **kw is probably not a strength of the 
> language definition but a flaw. If every implementation does the exact same 
> thing (especially if it’s been that way unchanged in every implementation 
> from 2.3 to 3.8), why not document that as the rule?

Agreed! If you don't follow this you are de facto a broken python 
implementation even if the spec allows it. 

> 
>>>> This feature is easy to implement and has broad applications. 
>>> 
>>> How is this implemented? Doesn’t the compiler have the same problem 
>>> generating a string for the keyword out of an AST that the user code would 
>>> have in the OP’s proposal?
>> 
>> Sure. The lack of round tripping in the standard library AST is a problem 
>> but in this case a simple AST dump is most likely fine even if it loses the 
>> users specific formatting. 
> 
> It’s not just about a lack of round tripping in the standard library AST, 
> it’s about a lack of round tripping in the implementation of the CPython, 
> PyPy, etc. compilers. If the compilers don’t have access to that information 
> internally, they can’t put it in the output.
> 
> And I think it would be pretty confusing if spam(=eggs+cheese) gave you an 
> argument named “eggs + cheese” instead of “eggs+cheese”. And it would be 
> annoying if you were using it to define labels on a displayed graph—you keep 
> trying to tweak the code to change how the label is written and it doesn’t do 
> what you tell it to do.

Agreed. But there must be a way to explicitly specify the label anyway so I 
don't think this is a deal breaker. 

/ Anders 
_______________________________________________
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/F7QFBVGJB2LGDKMQYSVOLR5RC46TNC7H/
Code of Conduct: http://python.org/psf/codeofconduct/

Reply via email to