On Jul 15, 2019, at 01:27, Serhiy Storchaka <storch...@gmail.com> wrote:
> 
> 14.07.19 23:20, Nima Hamidi пише:
>> Thank you for your question! It would depend on the implementation of 
>> DataFrame.__getitem__. Note that BoundExpression is endowed with locals and 
>> globals of the callee. So, it does have access to x in your example. I think 
>> the way that data.table in R handles this is that before evaluating the 
>> expression, __getitem__ simply adds columns to locals and then evaluates the 
>> expression. In your example, x already exists in locals, but the price 
>> doesn't. So, __getitem__ adds it to locals and so everything's there to 
>> evaluate the expression correctly. I think this feature is called 
>> "non-standard evaluation" because it lets programmers evaluate expressions 
>> in a context other than the standard context.
> 
> The problem with this is that you should know all column names to avoid 
> conflicts, even if you do not use them. If new columns be added which 
> conflict with your locals you could silently get an unexpected result.
> This is as bad as using a star import which overrides your globals or locals.

The feature as described allows the library to do whatever it wants with the 
namespaces, and letting locals take priority over columns, or raising an 
exception if there’s an ambiguity, are just as easy as letting columns take 
priority over locals. If one of those options is clearly better, then libraries 
like Pandas or SQLAlchemy or whatever are going to implement the better one, 
not the worse one.

> It would be better to mark either free or bound variables explicitly. For 
> example, dt[\price < x].

At that point I think you’re better off with the existing syntax, dt[dt.price < 
x]. When you want to explicitly specify a namespace, that’s what dot syntax 
already means.

Consider the case where dt is a join of two tables d1 and d2. Today you can 
write dt[d1.price * d2.taxrate < x]. With the proposed new feature, you could 
presumably write dt[price * taxrate < x], and get an exception if, say, both 
tables have price columns, but otherwise get exactly what you expected. I 
assume you think that’s too unclear or magical or whatever? But then I’m not 
sure how dt[\price * \taxrate < x] is much better.

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

Reply via email to