Title: Argument clinic: add support for creating method aliases · Issue #113270 · python/cpython · GitHub
Open Graph Title: Argument clinic: add support for creating method aliases · Issue #113270 · python/cpython
X Title: Argument clinic: add support for creating method aliases · Issue #113270 · python/cpython
Description: Feature or enhancement Proposal: Before argument clinic, creating method aliases in C extension classes was very easy: simply add another MethodDef for the same function: {"replace", _PyCFunction_CAST(datetime_replace), METH_VARARGS | ME...
Open Graph Description: Feature or enhancement Proposal: Before argument clinic, creating method aliases in C extension classes was very easy: simply add another MethodDef for the same function: {"replace", _PyCFunction_C...
X Description: Feature or enhancement Proposal: Before argument clinic, creating method aliases in C extension classes was very easy: simply add another MethodDef for the same function: {"replace", _PyC...
Opengraph URL: https://github.com/python/cpython/issues/113270
X: @github
Domain: github.com
{"@context":"https://schema.org","@type":"DiscussionForumPosting","headline":"Argument clinic: add support for creating method aliases","articleBody":"# Feature or enhancement\r\n\r\n### Proposal:\r\n\r\nBefore argument clinic, creating method aliases in C extension classes was very easy: simply add another MethodDef for the same function:\r\n```c\r\n {\"replace\", _PyCFunction_CAST(datetime_replace), METH_VARARGS | METH_KEYWORDS},\r\n {\"__replace__\", _PyCFunction_CAST(datetime_replace), METH_VARARGS | METH_KEYWORDS},\r\n```\r\nThis is very cheap and convenient. However, with argument clinic we cannot quite do this. If I do\r\n```c\r\n DATETIME_DATETIME_REPLACE_METHODDEF\r\n {\"__replace__\", _PyCFunction_CAST(datetime_datetime_replace), METH_FASTCALL | METH_KEYWORDS},\r\n```\r\nI have to manually copy the flags from the generated MethodDef into the one I wrote myself. This works now, but can break later if clinic generates a MethodDef with different flags. It is possible to work-around by copying the function, but this adds a maintenance burden and generates argument parsing twice, leading to code bloat.\r\n\r\nIt would be nice to have some syntax to tell argument clinic to generate the alias MethodDef. It could look like this:\r\n```c\r\n/*[clinic input]\r\nalias datetime.date.__replace__ = datetime.date.replace\r\n[clinic start generated code]*/\r\n```\r\nwhich would generate:\r\n```c\r\n#define DATETIME_DATETIME___REPLACE___METHODDEF \\\r\n {\"__replace__\", _PyCFunction_CAST(datetime_datetime_replace), METH_FASTCALL|METH_KEYWORDS, \\\r\n datetime_datetime_replace__doc__},\r\n```\r\nthat can then be used as usual:\r\n```c\r\n DATETIME_DATETIME_REPLACE_METHODDEF\r\n DATETIME_DATETIME___REPLACE___METHODDEF\r\n```\r\n\r\nThis is presently a problem for `code.__replace__`, which is an alias for generated `code.replace`[^1]. I also ran into this in #112921, where I convert datetime.*.replace methods to use argument clinic.\r\n\r\nCC @AlexWaygood @larryhastings @erlend-aasland \r\n\r\n[^1]: https://github.com/python/cpython/blob/893c9ccf48eacb02fa6ae93632f2d0cb6778dbb6/Objects/codeobject.c#L2180\r\n\r\n\r\n### Has this already been discussed elsewhere?\r\n\r\nNo response given\r\n\r\n### Links to previous discussion of this feature:\r\n\r\n_No response_","author":{"url":"https://github.com/eltoder","@type":"Person","name":"eltoder"},"datePublished":"2023-12-19T04:54:42.000Z","interactionStatistic":{"@type":"InteractionCounter","interactionType":"https://schema.org/CommentAction","userInteractionCount":25},"url":"https://github.com/113270/cpython/issues/113270"}
| route-pattern | /_view_fragments/issues/show/:user_id/:repository/:id/issue_layout(.:format) |
| route-controller | voltron_issues_fragments |
| route-action | issue_layout |
| fetch-nonce | v2:6130e07d-f966-6395-18f2-43689b252659 |
| current-catalog-service-hash | 81bb79d38c15960b92d99bca9288a9108c7a47b18f2423d0f6438c5b7bcd2114 |
| request-id | ABE2:B7306:1CFD9F5:2811964:696AACBE |
| html-safe-nonce | 8579ae4aca4cd9877afe6ab3b42463730b7a78c7723792b5c9d6649d4df262c9 |
| visitor-payload | eyJyZWZlcnJlciI6IiIsInJlcXVlc3RfaWQiOiJBQkUyOkI3MzA2OjFDRkQ5RjU6MjgxMTk2NDo2OTZBQUNCRSIsInZpc2l0b3JfaWQiOiIxODQ3NjY1MDQyODI3OTk5OSIsInJlZ2lvbl9lZGdlIjoiaWFkIiwicmVnaW9uX3JlbmRlciI6ImlhZCJ9 |
| visitor-hmac | 7a50221e89a3da6492fd84649336374dec149bb5f1ff1aabc6abf51256e64bda |
| hovercard-subject-tag | issue:2047919819 |
| github-keyboard-shortcuts | repository,issues,copilot |
| google-site-verification | Apib7-x98H0j5cPqHWwSMm6dNU4GmODRoqxLiDzdx9I |
| octolytics-url | https://collector.github.com/github/collect |
| analytics-location | / |
| fb:app_id | 1401488693436528 |
| apple-itunes-app | app-id=1477376905, app-argument=https://github.com/_view_fragments/issues/show/python/cpython/113270/issue_layout |
| twitter:image | https://opengraph.githubassets.com/7abf0d09a869420086228474c83d42ab3f618477d13fff6874d69728a179287a/python/cpython/issues/113270 |
| twitter:card | summary_large_image |
| og:image | https://opengraph.githubassets.com/7abf0d09a869420086228474c83d42ab3f618477d13fff6874d69728a179287a/python/cpython/issues/113270 |
| og:image:alt | Feature or enhancement Proposal: Before argument clinic, creating method aliases in C extension classes was very easy: simply add another MethodDef for the same function: {"replace", _PyCFunction_C... |
| og:image:width | 1200 |
| og:image:height | 600 |
| og:site_name | GitHub |
| og:type | object |
| og:author:username | eltoder |
| hostname | github.com |
| expected-hostname | github.com |
| None | 3eaf9b8cf1badcd7041a8ad480b9d9b28bea0ef1cc821ca9ff20f2cc7f4fe4b9 |
| turbo-cache-control | no-preview |
| go-import | github.com/python/cpython git https://github.com/python/cpython.git |
| octolytics-dimension-user_id | 1525981 |
| octolytics-dimension-user_login | python |
| octolytics-dimension-repository_id | 81598961 |
| octolytics-dimension-repository_nwo | python/cpython |
| octolytics-dimension-repository_public | true |
| octolytics-dimension-repository_is_fork | false |
| octolytics-dimension-repository_network_root_id | 81598961 |
| octolytics-dimension-repository_network_root_nwo | python/cpython |
| turbo-body-classes | logged-out env-production page-responsive |
| disable-turbo | false |
| browser-stats-url | https://api.github.com/_private/browser/stats |
| browser-errors-url | https://api.github.com/_private/browser/errors |
| release | dd9a979046e6382bd084e2bd873bf65f797125ff |
| ui-target | full |
| theme-color | #1e2327 |
| color-scheme | light dark |
Links:
Viewport: width=device-width