On Wed, Jun 3, 2020 at 2:13 PM Victor Stinner <vstin...@python.org> wrote:

> Le mer. 3 juin 2020 à 19:17, Mark Shannon <m...@hotpy.org> a écrit :
> > > I also *added* a bunch of *new* "getter" or "setter" functions to the
> > > public C API for my project of hiding implementation details, like
> > > making structures opaque:
> > > https://docs.python.org/dev/whatsnew/3.9.html#id1
> >
> > Adding "setters" is generally a bad idea.
> > "getters" can be computed if the underlying field disappears, but the
> > same may not be true for setters if the relation is not one-to-one.
> > I don't think there are any new setters in 3.9, so it's not an immediate
> > problem.
>
> You're making the assumption that the member can be set directly. But
> my plan is to make the structure opaque. In that case, you need
> getters and setters for all fields you would like to access. No member
> would be accessible directly anymore.
>
> > `PyThreadState_GetInterpreter()` can't replace `tstate->interp` for two
> > reasons.
> > 1. There is no way to stop third party C code accessing the internals of
> > data structures. We can warn them not to, but that's all.
> > 2. The internal layout of C structures has never been part of the API,
> > with arguably two exceptions; the PyTypeObject struct and the
> > `ob_refcnt` field of PyObject.
>
> My long term plan is to make all structures opaque :-) So far,
> PyInterpreterState structure was made opaque in Python 3.7. It helped
> *a lot* the development of Python 3.8 and 3.9, especially for
> subinterpreters. And I made PyGC_Head opaque in Python 3.9.
>
> Examples of issues to make structures opaque:
>
> PyGC_Head: https://bugs.python.org/issue40241 (done in Python 3.9)
> PyObject: https://bugs.python.org/issue39573
> PyTypeObject: https://bugs.python.org/issue40170
> PyThreadState: https://bugs.python.org/issue39947
> PyInterpreterState: https://bugs.python.org/issue35886 (done in Python
> 3.8)
>
> For the short term, my plan is to make structure opaque in the limited
> C API, before breaking more stuff in the public C API :-)
>

Indeed, your plan and the work you've been doing and discussing with other
core devs about this (including at multiple sprints and summits) over the
past 4+ years is the right one.  Our reliance on structs and related cpp
macros unfortunately exposed as public is a burden that freezes reasonable
CPython VM implementation evolution options.  This work moves us away from
that into a better place one step at a time without mass disruption.

More prior references related to this work are critical reading and should
not be overlooked:

[2017 "Keeping Python Competitive"] https://lwn.net/Articles/723949/
[2018 "Lets change the C API" thread]
https://mail.python.org/archives/list/python-dev@python.org/thread/B67MYCAO4H4AJNMLSWVT3UVFTHSDGQRB/#B67MYCAO4H4AJNMLSWVT3UVFTHSDGQRB
[2019 "The C API"]
https://pyfound.blogspot.com/2019/06/python-language-summit-lightning-talks-part-2.html
[2020-04 "PEP: Modify the C API to hide implementation details" thread -
with a lot of links to much earlier 2017 and such references]
https://mail.python.org/archives/list/python-dev@python.org/thread/HKM774XKU7DPJNLUTYHUB5U6VR6EQMJF/#HKM774XKU7DPJNLUTYHUB5U6VR6EQMJF
and Victors overall https://pythoncapi.readthedocs.io/roadmap.html as
referenced a few places in those.

It is also worth paying attention to the
https://mail.python.org/archives/list/capi-...@python.org/latest mailing
list for anyone with a CPython C API interest.

-gps


>
> > PyObject_CallNoArgs() seems harmless.
> > Rationalizing the call API has merit, but PyObject_CallNoArgs()
> > leads to PyObject_CallOneArg(), PyObject_CallTwoArgs(), etc. and an even
> > larger API.
>
> PyObject_CallOneArg() also exists:
> https://docs.python.org/dev/c-api/call.html#c.PyObject_CallOneArg
>
> It was added as a private function https://bugs.python.org/issue37483
> add made public in commit 3f563cea567fbfed9db539ecbbacfee2d86f7735
> "bpo-39245: Make Vectorcall C API public (GH-17893)".
>
> But it's missing in What's New in Python 3.9.
>
> There is no plan for two or more arguments.
>
>
> > PyObject_GC_IsTracked(). I don't like this.
> > Shouldn't GC track *all* objects?
> > Even if it were named PyObject_Cycle_GC_IsTracked() it would be exposing
> > internal implementation details for no good reason. A cycle GC that
> > doesn't "track" individual objects, but treats all objects the same
> > could be more efficient. In which case, what would this mean?
> >
> > What is the purpose of PyObject_GC_IsFinalized()?
> > Third party objects can easily tell if they have been finalized.
> > Why they would ever need this information is a mystery to me.
>
> Did you read the issues which added these functions to see the
> rationale? https://bugs.python.org/issue40241
>
> I like the "(Contributed by xxx in bpo-xxx.)" in What's New in Python
> 3.9: it became trivial to find such rationale.
>
> Victor
> --
> Night gathers, and now my watch begins. It shall not end until my death.
> _______________________________________________
> Python-Dev mailing list -- python-dev@python.org
> To unsubscribe send an email to python-dev-le...@python.org
> https://mail.python.org/mailman3/lists/python-dev.python.org/
> Message archived at
> https://mail.python.org/archives/list/python-dev@python.org/message/QZ2Q7ELTDZUQLVS54T53CPEINWNQB6HF/
> Code of Conduct: http://python.org/psf/codeofconduct/
>
_______________________________________________
Python-Dev mailing list -- python-dev@python.org
To unsubscribe send an email to python-dev-le...@python.org
https://mail.python.org/mailman3/lists/python-dev.python.org/
Message archived at 
https://mail.python.org/archives/list/python-dev@python.org/message/EVXMNE2UAAZ7B7FIP5TQFCV674NMA3CM/
Code of Conduct: http://python.org/psf/codeofconduct/

Reply via email to