On Wed, 22 Jun 2022 at 08:36, Carl Meyer <c...@oddbird.net> wrote:
>
>
>
> On Tue, Jun 21, 2022 at 4:28 PM Chris Angelico <ros...@gmail.com> wrote:
>>
>> On Wed, 22 Jun 2022 at 08:21, Carl Meyer via Python-ideas
>> <python-ideas@python.org> wrote:
>> >
>> >
>> >
>> > On Tue, Jun 21, 2022 at 4:10 PM David Mertz, Ph.D. <david.me...@gmail.com> 
>> > wrote:
>> >>
>> >> On Tue, Jun 21, 2022 at 5:53 PM Brendan Barnwell <brenb...@brenbarn.net> 
>> >> wrote:
>> >>>
>> >>> > In the example, we assume that the built-in function `type()` is 
>> >>> > special
>> >>> > in not counting as a reference to the binding for purpose of realizing 
>> >>> > a
>> >>> > computation. Alternately, some new special function like 
>> >>> > `isdeferred()` might be used to
>> >>> > check for ``Deferred`` objects.
>> >>>
>> >>> I'll have to ponder my thoughts about the proposal as a whole, but this
>> >>> particular aspect seems dubious to me.  As I understand it this would
>> >>> require some fairly deep changes to how evaluation works in Python.
>> >>> Right now in an expression like `type(blah)`, there isn't any way for
>> >>> the evaluation of `blah` to depend on the fact that it happens to occur
>> >>> as an argument to `type`.
>> >>
>> >>
>> >> I absolutely agree that this is a sore point in my first draft.  I could 
>> >> shift the magic from `type()` to `isdeferred()`, but that doesn't really 
>> >> change anything for your examples.  I suppose, that is, unless 
>> >> `isdeferred()` becomes something other than a real function, but more 
>> >> like some sort of macro.  That doesn't make me happy either.
>> >>
>> >> However, I *would* like to be able to answer the question "Is this object 
>> >> a DeferredObject?" somehow.  For example, I'd like some way to write code 
>> >> similar to:
>> >>
>> >> if isdeferred(expensive_result):
>> >>     log.debug("The computationally expensive result is not worth 
>> >> calculating here")
>> >> else:
>> >>     log.debug(f"We already hit a path that needed the result, and it is 
>> >> {expensive_result}")
>> >>
>> >> Any thoughts on what might be the least ugly way to get that?
>> >
>> >
>> > I think all it really requires is for isdeferred() to be a builtin 
>> > implemented in C rather than Python. It will be much better IMO to have 
>> > isdeferred() returning a bool and not have any deferred object/type 
>> > visible to Python.
>> >
>>
>> It would have to be non-assignable and probably a keyword. Otherwise,
>> the exact same issues will keep occurring.
>
>
> Mmm, you’re right. It would either need to be handled specially in the 
> compiler, or it would have to use the PEP 690 approach of 
> `is_lazy_import(globals(), “name”)` where it takes both the namespace 
> dictionary and the key as string, to avoid triggering reification.
>
>> What are the scoping rules for deferred objects? Do they access names
>> where they are evaluated, or where they are defined? Consider:
>>
>> def f(x):
>>     spam = 1
>>     print(x)
>>
>> def g():
>>     spam = 2
>>     f(later spam)
>>
>> g()
>>
>> Does this print 1 or 2?
>>
>> This is a fundamental and crucial point, and must be settled early.
>> You cannot defer this. :)
>
>
> Yes, I agree this is a crucial point, and the answer (which is already 
> somewhat implied by the analogy to lambdas) should be that it closes over the 
> definition scope (just like defining a lambda or online function would.)
>

If that's the case, then the example of late-bound argument defaults
simply won't work.

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

Reply via email to