On Tue, Jun 7, 2016 at 6:20 PM, Ethan Furman <et...@stoneleaf.us> wrote:
> On 06/07/2016 05:50 PM, Eric Snow wrote:
>>         __definition_order__ = tuple(k for k in locals()
>>                                      if (!k.startswith('__') or
>>                                          !k.endswith('__')))
>
>
> Still mixing C and Python!  ;)

I knew I was missing something!

>
>
>> Why a tuple?
>> ------------
>>
>> Use of a tuple reflects the fact that we are exposing the order in
>> which attributes on the class were *defined*.  Since the definition
>> is already complete by the time ``definition_order__`` is set, the
>> content and order of the value won't be changing.  Thus we use a type
>> that communicates that state of immutability.
>
>
>> Why a read-only attribute?
>> --------------------------
>>
>> As with the use of tuple, making ``__definition_order__`` a read-only
>> attribute communicates the fact that the information it represents is
>> complete.  Since it represents the state of a particular one-time event
>> (execution of the class definition body), allowing the value to be
>> replaced would reduce confidence that the attribute corresponds to the
>> original class body.
>>
>> If a use case for a writable (or mutable) ``__definition_order__``
>> arises, the restriction may be loosened later.  Presently this seems
>> unlikely and furthermore it is usually best to go immutable-by-default.
>
>
> If __definition_order__ is supposed to be immutable as well as read-only
> then we should convert non-tuples to tuples.  No point in letting that
> user bug slip through.

Do you mean if a class explicitly defines __definition_order__?  If
so, I'm not clear on how that would work.  It could be set to
anything, including None or a value that does not iterate into a
definition order.  If someone explicitly set __definition_order__ then
I think it should be used as-is.

>
>
>> Why ignore "dunder" names?
>> --------------------------
>>
>> Names starting and ending with "__" are reserved for use by the
>> interpreter.  In practice they should not be relevant to the users of
>> ``__definition_order__``.  Instead, for early everyone they would only
>
>
> s/early/nearly

fixed

>
>> Why is __definition_order__ even necessary?
>> -------------------------------------------
>>
>> Since the definition order is not preserved in ``__dict__``, it would be
>> lost once class definition execution completes.  Classes *could*
>> explicitly set the attribute as the last thing in the body.  However,
>> then independent decorators could only make use of classes that had done
>> so.  Instead, ``__definition_order__`` preserves this one bit of info
>> from the class body so that it is universally available.
>
>
> s/would be/is

fixed

Thanks!

-eric
_______________________________________________
Python-Dev mailing list
Python-Dev@python.org
https://mail.python.org/mailman/listinfo/python-dev
Unsubscribe: 
https://mail.python.org/mailman/options/python-dev/archive%40mail-archive.com

Reply via email to