Uh oh!
There was an error while loading.Please reload this page.
- Notifications
You must be signed in to change notification settings - Fork33.3k
gh-106572: Deprecate PyObject_SetAttr(v, name, NULL)#106573
New issue
Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.
By clicking “Sign up for GitHub”, you agree to ourterms of service andprivacy statement. We’ll occasionally send you account related emails.
Already on GitHub?Sign in to your account
Uh oh!
There was an error while loading.Please reload this page.
Conversation
encukou commentedJul 10, 2023
I don't think the minimum deprecation period is appropriate here. |
vstinner commentedJul 10, 2023
I modified the PR: itno longer plans to convert this feature to an error (in Python 3.15): it only deprecates the feature (emit DeprecationWarning). I also rebased the PR and fixed the issue number (issue#106572 is the correct issue!).
I proposed the bare minimum. If you consider that it's too short, honestly, I would prefer to just unschedule the removal and discuss it later, once we will have a better idea of how many C extensions in the wild are impacted. |
vstinner commentedJul 10, 2023
1ee5f8c to83ac93fCompare
encukou left a comment
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others.Learn more.
I believe deprecating what wasthe way to remove attributes, just because some uses are error-prone, is too drastic and will hurt Python and its users.
bedevere-bot commentedJul 10, 2023
When you're done making the requested changes, leave the comment: And if you don't make the requested changes, you will be put in the comfy chair! |
vstinner commentedJul 10, 2023
serhiy-storchaka left a comment
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others.Learn more.
For smoother future changes we can add a way to enable or disable this at compile time. Just surround the warning code with#ifdef SOMENAME/#endif but keep SOMENAME undefined for now. Then those who want to test it ahead can make custom Python build. What are your thoughts?
| in favour of using:c:func:`PyObject_DelAttr`, but there are currently no | ||
| plans to remove it. | ||
| ..deprecated::3.13 | ||
| Calling ``PyObject_SetAttrString(o, attr_name, NULL)`` is deprecated: |
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others.Learn more.
Maybe add "for removing an attribute"?
encukou commentedJul 11, 2023
That sounds likecapi-workgroup/problems#54 |
1f5bbc2 to936bd14CompareIf the value is NULL, PyObject_SetAttr() and PyObject_SetAttrString()emit a DeprecationWarning in Python Development Mode or if Python isbuilt in debug mode.weakref proxy_setattr() calls PyObject_DelAttr() if value is NULL.
vstinner commentedJul 11, 2023
If updated my PR to only emit a DeprecationWarning in the Python Development Mode or if Python is built in debug mode.
The value can be NULL without an exception being set. What if you use PyDict_GetItem() with PyObject_SetAttr()? If the key exists in the dict, you're good. If the key doesn't exist in the dict (for whatever reason), you delete the attribute: is it what you wanted to do? There is no exception set with such weird API. Apparently, some developers don't know that this function can be used todelete attributes: see the old#69877 issue for example. |
encukou commentedJul 12, 2023
My objection stands. |
vstinner commentedJul 12, 2023
Well, I propose an PR to remove the deprecation:@serhiy-storchaka disagreed. Now I propose a PR to emit a warning,@encukou disagree. @serhiy-storchaka and@encukou: can you try to agree on what should be done? My concern is that if the feature is deprecated, most people will not be aware of it without a deprecation warning emitted at runtime. Do you want to help users to discover potential bugs in their code? Or do we want to leave them alone and just write doc? |
encukou commentedJul 12, 2023
IMO we roughly agree, at least on what should happen for 3.13? Serhiy:
me:
Are you aware of any actual users who got confused by this? ( |
vstinner commentedJul 12, 2023
@serhiy-storchaka who asked to deprecate using these functions to delete attributes: see links to previous discussions in above comments. |
vstinner commentedJul 12, 2023
We can leave the old ABI unchanged, add a new function with a different name,and leave the API unchanged: no need to expose the new name in the public API. Old ABI name, left unchanged (no warnings): SetAttr |
vstinner commentedJul 12, 2023
See also:capi-workgroup/problems#39 "Supporting multiple ABI versions at once". |
serhiy-storchaka commentedJul 12, 2023
I do not disagree with@encukou. I proposed to add a runtime warning few versions after making The goal is not to break the user code, not to force them to change their code, but to help them to find potential bugs which are difficult to find now. |
vstinner commentedJul 12, 2023
DeprecationWarning is ignored by default. My proposed PR don't even emit DeprecationWarning by default, but only in Python Development Mode (-X dev). |
methane commentedJul 12, 2023
I'm +1 on Victor, emit warning only in devmode. |
serhiy-storchaka commentedJul 12, 2023
Some developers run their tests with enabled DeprecationWarning. Could it be at least PendingDeprecationWarning? |
vstinner commentedJul 12, 2023
I don't get it. Isn't the purpose of this change helping developers to identify unsafe C API usage? If the intent is to hardly ignore the deprecation warning, maybe the whole idea of emitting a warning should be abandoned? I don't get it. |
serhiy-storchaka commentedJul 12, 2023
We should be less persistent in forcing this change than in case of other deprecated warnings. I think it is a compromise between breaking user code and keeping the status quo. |
encukou commentedJul 13, 2023 • edited
Loading Uh oh!
There was an error while loading.Please reload this page.
edited
Uh oh!
There was an error while loading.Please reload this page.
I think you're solving a non-issue -- a minor API wart we should avoid in the future, but that's it. I don't think even making the docs more complex is worth it, but, I won't block this iteration of the PR. |
vstinner commentedJul 25, 2023
I close the issue. I don't care enough about this issue to argue about the exact migration plan. PyObject_DelAttr() and PyObject_DelAttrString() are now implemented as a function in Python 3.13. Serhiy:
That done in commit1f2921b. Petr:
I'm not convinced of the benefits of emitting a warning only if an exception is set. |
Uh oh!
There was an error while loading.Please reload this page.
If the value is NULL, PyObject_SetAttr() and PyObject_SetAttrString()
emit a DeprecationWarning in Python Development Mode or if Python is
built in debug mode.
weakref proxy_setattr() calls PyObject_DelAttr() if value is NULL.
📚 Documentation preview 📚:https://cpython-previews--106573.org.readthedocs.build/