On 04/26/18 09:32, Thomas Wouters wrote:

Thanks for working on this, Marcel (and Petr). This looks like an ambitious intern project :) Couple of questions and comments in-line.

Indeed, but also a multi-year one. Sometimes it seems like Python is moving too fast under us!

Specifically, PEP 573 (Unifying function/method classes) andto a smaller extent PEP 567 (Context Variables) seem to be solving similar problems as this PEP. I'm inclined to put this PEP temporarily on hold, help 575 get accepted, and then rebase on top of that.


On Mon, Apr 23, 2018 at 12:36 PM, Marcel Plch <gmarcel.p...@gmail.com <mailto:gmarcel.p...@gmail.com>> wrote:
    PEP: 573
[...]

    Abstract
    ========

[...]

    Additionaly, support for easier creation of immutable exception
    classes is added.


I'm not a fan of using 'immutable' here, or in the API function name. I understand the types are to some extent immutable (apart from their refcount, I assume), but I think it's going to be too easy to confuse it with types whose *instances* are immutable. (We do occasionally say things like "tuples are an immutable type".) Since the point is that they behave like statically defined ones, perhaps 'Static' would be a reasonable replacement.

That was the first naming choice, but then on the other hand, "static heap type" sounds like an oxymoron -- in C, static things don't live on the heap.
Naming is hard :(


[...]
    Slot methods
    ------------

    The above changes don't cover slot methods, such as ``tp_iter`` or
    ``nb_add``.

    The problem with slot methods is that their C API is fixed, so we can't
    simply add a new argument to pass in the defining class.
    Two possible solutions have been proposed to this problem:

         * Look up the class through walking the MRO.
           This is potentially expensive, but will be useful if
    performance is not
           a problem (such as when raising a module-level exception).
         * Storing a pointer to the defining class of each slot in a
    separate table,
           ``__typeslots__`` [#typeslots-mail]_.  This is technically
    feasible and fast,
           but quite invasive.

    Due to the invasiveness of the latter approach, this PEP proposes
    adding an MRO walking
    helper for use in slot method implementations, deferring the more
    complex alternative
    as a potential future optimisation. Modules affected by this concern
    also have the
    option of using thread-local state or PEP 567 context variables, or
    else defining their
    own reload-friendly lookup caching scheme.


I do not believe walking the MRO is going to work without reworking the implementation of types, specifically how typeobject.c deals with slots of subclasses: in some cases copies the slots from the base class (see inherit_slots() and from where it's called). I believe this would cause problems if, for example, you define type X in module A, subclass it from type Y in module B without overriding the slot, and try to find the module object for A from the slot implementation. I don't think copying slots is a requirement for the desired semantics, but it's going to be fairly involved to rewrite it to do something else. There's also backward-compatibility to consider: third-party libraries can be inheriting from builtin types (e.g. numpy does this extensively) using the same copying-slot mechanism, which means those builtin types can't use the MRO walking to find their module without breaking compatibility with those third-party libraries.

The MRO walking code needs to deal with copied slots. It's not straigtforward, but I do think it's possible.


[...]
    Static exceptions
    -----------------

    A new function will be added::

         int PyErr_PrepareImmutableException(PyTypeObject **exc,
                                          const char *name,
                                          const char *doc,
                                          PyObject *base)

    Creates an immutable exception type which can be shared
    across multiple module objects.


How is this going to deal with type.__subclasses__()? Is re-using the static type object between reloads and sub-interpreters important enough to warrant the different behaviour? What if sub-interpreters end up wanting to disallow sharing objects between them?

Argh. Yes, subclasses seem to be the obvious shortcoming that a fresh pair of eyes is bound to find. Thanks!
This sends the proposal back to the drawing board.



[...]
    Modules Converted in the Initial Implementation
    -----------------------------------------------

    To validate the approach, several modules will be modified during
    the initial implementation:

    The ``zipimport``, ``_io``, ``_elementtree``, and ``_csv`` modules
    will be ported to PEP 489 multiphase initialization.


zipimport currently caches things in C globals. Changing it to use PEP 489 multi-phase initialisation is very likely going to change semantics in subtle ways... Is it really worth the risk?

The whole excercise is to show that existing modules *can* be ported to the new approach, without unacceptable changes to semantics -- and in cases where they can't, to improve the situation. So even if changes to zipimport ultimately aren't accepted, it makes sense to attempt this.



_______________________________________________
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