Pass opaque state to PyContext_AddWatcher callback
Chưa có ai nhận issue này.
- Ngôn ngữ chính
- Python
- Star
- 77.2k
- Fork
- 36k
- Chỉ số merge pull request
- Chỉ số pull request đang chờ
Mô tả
Feature or enhancement
Proposal:
I would like to change the Context watcher C API (new to v3.14, see #119333) to pass an opaque pointer to the callback. Specifically, change:
to:
/*
* Context object watcher callback function. arg is the same pointer passed to
* PyContext_AddWatcher when the callback was registered. The object passed to
* the callback is event-specific; see PyContextEvent for details.
*
* if the callback returns with an exception set, it must return -1. Otherwise
* it should return 0
*/
typedef int PyContext_WatchCallback(
void *arg, PyContextEvent event, PyObject *obj);
/*
* Register a per-interpreter callback that will be invoked for context events.
* arg is an optional opaque pointer that is passed back to the callback; it
* can be used to manage state if desired.
*
* Returns a handle that may be passed to PyContext_ClearWatcher on success,
* or -1 and sets and error if no more handles are available.
*/
PyAPI_FUNC(int) PyContext_AddWatcher(
PyContext_WatchCallback *callback, void *arg);
The original idea was for the callback to get any required state from the current context, but:
- The config/state is not guaranteed to be available in the context. For example, the Python code can do
ctx = contextvars.Context()instead ofctx = contextvars.copy_context(). Or it can docopy_context(), but early during initialization and squirrel the context away for later use. The latter seems plausible for 3rd party libraries (where the user might not have much control). - The same watcher callback cannot be registered multiple times simultaneously, each with its own config/state. This came up while I was refactoring
TestContextObjectWatchersto add some more tests for a change I’m working on.
I’m not sure how likely either is to come up in normal use, but I think it is worth changing the design before the 3.14 release cements it.
Has this already been discussed elsewhere?
I have already discussed this feature proposal on Discourse
Links to previous discussion of this feature:
https://discuss.python.org/t/v3-14a1-design-limitations-of-pycontext-addwatcher/68177/4
cc @fried
Linked PRs
- gh-127140
- gh-127247
Hướng dẫn đóng góp
Bắt đầu từ đâu
- Đọc hết issue, rồi đọc hướng dẫn đóng góp của dự án.
- Bình luận trên issue rằng bạn sẽ nhận — tránh hai người làm cùng một việc.
- Fork repository và làm thay đổi trên một nhánh.
- Mở pull request có tham chiếu số hiệu của issue.
Hướng nghiên cứu
Bắt đầu với Include/cpython/context.h, tại các khai báo Context watcher, và xem xét Lib/test/test_capi/test_watchers.py, đặc biệt là TestContextObjectWatchers. Kiểm tra các PR được liên kết trước khi bắt đầu, sau đó xác minh rằng opaque pointer đã đăng ký được truyền đến callback và các bài kiểm thử watcher bao quát API đã cập nhật và chạy đạt.
Do mô hình lập chỉ mục viết ra từ nội dung của issue.
Đánh giá
- Công nghệ
- c, python
- Lĩnh vực
- api
- Loại issue
- Tính năng
- Độ khó
- 4/5
- Thời gian dự kiến
- 3-5 ngày
- Mức độ hoạt động
- Đình trệ
- Độ rõ ràng
- Đặc tả rõ ràng
- Mức phù hợp với người mới
- 30/100