Title: [Bug]: make_norm_from_scale should create picklable classes even when used in-line. · Issue #20755 · matplotlib/matplotlib · GitHub
Open Graph Title: [Bug]: make_norm_from_scale should create picklable classes even when used in-line. · Issue #20755 · matplotlib/matplotlib
X Title: [Bug]: make_norm_from_scale should create picklable classes even when used in-line. · Issue #20755 · matplotlib/matplotlib
Description: Bug summary The new matplotlib.colors.make_norm_from_scale helper dynamically generates a norm class from a scale class. Currently, in the codebase, it is only used as a decorator to create "toplevel" classes (e.g., it is used to generat...
Open Graph Description: Bug summary The new matplotlib.colors.make_norm_from_scale helper dynamically generates a norm class from a scale class. Currently, in the codebase, it is only used as a decorator to create "toplev...
X Description: Bug summary The new matplotlib.colors.make_norm_from_scale helper dynamically generates a norm class from a scale class. Currently, in the codebase, it is only used as a decorator to create "t...
Opengraph URL: https://github.com/matplotlib/matplotlib/issues/20755
X: @github
Domain: github.com
{"@context":"https://schema.org","@type":"DiscussionForumPosting","headline":"[Bug]: make_norm_from_scale should create picklable classes even when used in-line.","articleBody":"### Bug summary\n\nThe new `matplotlib.colors.make_norm_from_scale` helper dynamically generates a norm class from a scale class. Currently, in the codebase, it is only used as a decorator to create \"toplevel\" classes (e.g., it is used to generate LogNorm from LogScale, etc.), but it can also be used within other functions to dynamically generate a norm class based on a user-given arbitrary scale (see #20752 for an example of application, which is however not necessary to understand for what follows). In the latter case, the dynamically generate class is currently not picklable (because pickling of classes relies on the existence of global names, see e.g. [\"classes are pickled by named reference\"](https://docs.python.org/3/library/pickle.html#what-can-be-pickled-and-unpickled )). It would be generally useful to get rid of this restriction, which can be done by implementing the [`__reduce__` protocol](https://docs.python.org/3/library/pickle.html#object.__reduce__); there's already other examples in the codebase of dynamically generated classes that use the same mechanism).\r\n\r\nI'm tagging this as \"good first issue\" because there's no API design and the eng goal is clear, but medium (perhaps hard) difficulty because it requires somewhat sophisticated understanding of the details of the pickling process.\n\n### Code for reproduction\n\n```python\npickle.dumps(matplotlib.colors.make_norm_from_scale(matplotlib.scale.LogitScale, matplotlib.colors.Normalize))\n```\n\n\n### Actual outcome\n\n```\r\nCan't pickle \u003cclass 'matplotlib.colors.Normalize'\u003e: it's not the same object as matplotlib.colors.Normalize\r\n```\r\n(Note the additional confusion here: there's two classes that are both named `matplotlib.colors.Normalize` -- the original one and the dynamically generated one -- but they are different.)\n\n### Expected outcome\n\nA correct round-trippable pickle.\n\n### Operating system\n\n_No response_\n\n### Matplotlib Version\n\nmaster (unreleased, pre 3.5)\n\n### Matplotlib Backend\n\n_No response_\n\n### Python version\n\n_No response_\n\n### Jupyter version\n\n_No response_\n\n### Other libraries\n\n_No response_\n\n### Installation\n\nsource\n\n### Conda channel\n\n_No response_","author":{"url":"https://github.com/anntzer","@type":"Person","name":"anntzer"},"datePublished":"2021-07-28T08:21:36.000Z","interactionStatistic":{"@type":"InteractionCounter","interactionType":"https://schema.org/CommentAction","userInteractionCount":5},"url":"https://github.com/20755/matplotlib/issues/20755"}
| 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:2541cdb5-bc1f-9b83-8fc2-bcfcead5f03c |
| current-catalog-service-hash | 81bb79d38c15960b92d99bca9288a9108c7a47b18f2423d0f6438c5b7bcd2114 |
| request-id | 8F7A:17596C:3E3A82:52BC94:6A516D2D |
| html-safe-nonce | 7eb86a73258bef05f7ba67bf933bf2d0a3c0e17ba4819f5df8584667105c5577 |
| visitor-payload | eyJyZWZlcnJlciI6IiIsInJlcXVlc3RfaWQiOiI4RjdBOjE3NTk2QzozRTNBODI6NTJCQzk0OjZBNTE2RDJEIiwidmlzaXRvcl9pZCI6IjEzNjMyMzAxOTY3MzAwNTM1NyIsInJlZ2lvbl9lZGdlIjoiaWFkIiwicmVnaW9uX3JlbmRlciI6ImlhZCJ9 |
| visitor-hmac | ba192f7e2437c00276f5d064432d47fb9d8f64bebd0a9024c419f55b88ea9018 |
| hovercard-subject-tag | issue:954604558 |
| 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/matplotlib/matplotlib/20755/issue_layout |
| twitter:image | https://opengraph.githubassets.com/6dea34773f4afe38f72064599ccda54908b6e502326d12d65168a1d59931bbd9/matplotlib/matplotlib/issues/20755 |
| twitter:card | summary_large_image |
| og:image | https://opengraph.githubassets.com/6dea34773f4afe38f72064599ccda54908b6e502326d12d65168a1d59931bbd9/matplotlib/matplotlib/issues/20755 |
| og:image:alt | Bug summary The new matplotlib.colors.make_norm_from_scale helper dynamically generates a norm class from a scale class. Currently, in the codebase, it is only used as a decorator to create "toplev... |
| og:image:width | 1200 |
| og:image:height | 600 |
| og:site_name | GitHub |
| og:type | object |
| og:author:username | anntzer |
| hostname | github.com |
| expected-hostname | github.com |
| None | b9a586c06a05a7a86fc7e3f4dbd03e42f6869085879aa184aa6369456dbd50fb |
| turbo-cache-control | no-preview |
| go-import | github.com/matplotlib/matplotlib git https://github.com/matplotlib/matplotlib.git |
| octolytics-dimension-user_id | 215947 |
| octolytics-dimension-user_login | matplotlib |
| octolytics-dimension-repository_id | 1385122 |
| octolytics-dimension-repository_nwo | matplotlib/matplotlib |
| octolytics-dimension-repository_public | true |
| octolytics-dimension-repository_is_fork | false |
| octolytics-dimension-repository_network_root_id | 1385122 |
| octolytics-dimension-repository_network_root_nwo | matplotlib/matplotlib |
| 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 | 60eaaf6d4dbaa817031b556aebd8a0a7eeb81b97 |
| ui-target | full |
| theme-color | #1e2327 |
| color-scheme | light dark |
Links:
Viewport: width=device-width