> I agree that this adds ambiguity where we can't be sure whether text .= 
> encode('utf-8') is referring to the function or the method. We can infer 
> that it *ought* to be the method, and maybe even add a rule to force 
> that, but this works only for the simple cases. It is risky and error 
> prone in the hard cases.
I think it would be a good idea to treat all global name lookups as lookups on 
the object on the LHS when you’re on the RHS of .=.

This behavior prevents the worst mistakes and makes it very clear what is 
happening.

Sent from my iPhone

> On Sep 27, 2018, at 8:03 PM, Steven D'Aprano <st...@pearwood.info> wrote:
> 
> On Thu, Sep 27, 2018 at 10:44:38PM +0300, Taavi Eomäe wrote:
>>> Do you see how this creates an ambiguous situation?
>> 
>> Name shadowing could create such ambiguous situations anyways even without
>> the new operator?
> 
> How? Can you give an example?
> 
> Normally, there is no way for a bare name to shadow a dotted name, or 
> vice versa, since the dotted name always needs to be fully qualified. In 
> the example below, we can talk about "text.encode" which is always the 
> method, or "encode", which is always the function and never the method.
> 
> I agree that this adds ambiguity where we can't be sure whether text .= 
> encode('utf-8') is referring to the function or the method. We can infer 
> that it *ought* to be the method, and maybe even add a rule to force 
> that, but this works only for the simple cases. It is risky and error 
> prone in the hard cases.
> 
> Think about a more complex assignment:
> 
>    text .= encode(spam) + str(eggs)
> 
> This could mean any of:
> 
>    text.encode(spam) + text.str(eggs)
>    text.encode(spam) + str(eggs)
>    encode(spam) + text.str(eggs)
>    encode(spam) + str(eggs)
> 
> In a statically typed language, the compiler could work out what is 
> needed at compile-time (it knows that text.str doesn't exist) and either 
> resolve any such ambiguities or refuse to compile. But in a dynamic 
> language like Python, you can't tell whether text.str exists or not 
> until you try it.
> 
> So this proposal suffers from the same problems as Pascal-style "with" 
> blocks, which are a FAQ:
> 
> https://docs.python.org/3/faq/design.html#why-doesn-t-python-have-a-with-statement-for-attribute-assignments
> 
> [...]
>>>> On 2018-09-27 14:13, Calvin Spealman wrote:
>>>> Absolutely -1 on this. Consider the following example:
>>>> 
>>>> def encode(s, *args):
>>>>     """Force UTF 8 no matter what!"""
>>>>     return s.encode('utf8')
>>>> 
>>>> text = "Hello, there!"
>>>> text .= encode('latin1')
> 
> 
> 
> -- 
> Steve
> _______________________________________________
> Python-ideas mailing list
> Python-ideas@python.org
> https://mail.python.org/mailman/listinfo/python-ideas
> Code of Conduct: http://python.org/psf/codeofconduct/
_______________________________________________
Python-ideas mailing list
Python-ideas@python.org
https://mail.python.org/mailman/listinfo/python-ideas
Code of Conduct: http://python.org/psf/codeofconduct/

Reply via email to