Title: [ENH]: Should we hide _preprocess_data from the stack trace? · Issue #29863 · matplotlib/matplotlib · GitHub
Open Graph Title: [ENH]: Should we hide _preprocess_data from the stack trace? · Issue #29863 · matplotlib/matplotlib
X Title: [ENH]: Should we hide _preprocess_data from the stack trace? · Issue #29863 · matplotlib/matplotlib
Description: Problem When a method with @_preprocess_data raises an exception the decorator shows up in the call stack: ValueError Traceback (most recent call last) Cell In[7], line 6 4 fig, ax = plt.subplots() 5 data = [10, 20, float('nan'), 40] ---...
Open Graph Description: Problem When a method with @_preprocess_data raises an exception the decorator shows up in the call stack: ValueError Traceback (most recent call last) Cell In[7], line 6 4 fig, ax = plt.subplots()...
X Description: Problem When a method with @_preprocess_data raises an exception the decorator shows up in the call stack: ValueError Traceback (most recent call last) Cell In[7], line 6 4 fig, ax = plt.subplots()...
Opengraph URL: https://github.com/matplotlib/matplotlib/issues/29863
X: @github
Domain: github.com
{"@context":"https://schema.org","@type":"DiscussionForumPosting","headline":"[ENH]: Should we hide _preprocess_data from the stack trace?","articleBody":"### Problem\n\nWhen a method with `@_preprocess_data` raises an exception the decorator shows up in the call stack:\n\n```\nValueError Traceback (most recent call last)\nCell In[7], line 6\n 4 fig, ax = plt.subplots()\n 5 data = [10, 20, float('nan'), 40]\n----\u003e 6 ax.pie(data, labels=[\"A\", \"B\", \"C\", \"D\"])\n 7 plt.show()\n\nFile ~\\AppData\\Local\\miniforge3\\envs\\jupyter\\Lib\\site-packages\\matplotlib\\__init__.py:1473, in _preprocess_data.\u003clocals\u003e.inner(ax, data, *args, **kwargs)\n 1470 @functools.wraps(func)\n 1471 def inner(ax, *args, data=None, **kwargs):\n 1472 if data is None:\n-\u003e 1473 return func(\n 1474 ax,\n 1475 *map(sanitize_sequence, args),\n 1476 **{k: sanitize_sequence(v) for k, v in kwargs.items()})\n 1478 bound = new_sig.bind(ax, *args, **kwargs)\n 1479 auto_label = (bound.arguments.get(label_namer)\n 1480 or bound.kwargs.get(label_namer))\n\nFile ~\\AppData\\Local\\miniforge3\\envs\\jupyter\\Lib\\site-packages\\matplotlib\\axes\\_axes.py:3334, in Axes.pie(self, x, explode, labels, colors, autopct, pctdistance, shadow, labeldistance, startangle, radius, counterclock, wedgeprops, textprops, center, frame, rotatelabels, normalize, hatch)\n 3331 x += expl * math.cos(thetam)\n 3332 y += expl * math.sin(thetam)\n-\u003e 3334 w = mpatches.Wedge((x, y), radius, 360. * min(theta1, theta2),\n 3335 360. * max(theta1, theta2),\n 3336 facecolor=get_next_color(),\n 3337 hatch=next(hatch_cycle),\n 3338 clip_on=False,\n 3339 label=label)\n 3340 w.set(**wedgeprops)\n 3341 slices.append(w)\n```\n\nThis is rather distracting and makes the stacktrace harder to read.\n\n### Proposed solution\n\nWe could filter the decorator out of the stacktrace like this\n\n```\ndef hidden_decorator(func):\n @functools.wraps(func)\n def wrapper(*args, **kwargs):\n try:\n return func(*args, **kwargs)\n except Exception as e:\n # Modify the traceback to remove the wrapper from the stack trace\n tb = traceback.extract_tb(sys.exc_info()[2])\n # Filter out the wrapper's frame\n filtered_tb = [frame for frame in tb if frame.name != wrapper.__name__]\n # Raise the exception with the modified traceback\n raise e.with_traceback(traceback.extract_stack(filtered_tb))\n return wrapper\n```\n\nIs this a reasonable idea? On the one hand, it's removing irrelevant information (the decorator is an implemenation detail that should not bother the user or anybody debugging internal errors. On the other hand, a stack trace is a technical detail and it may be better to tell the full story there.","author":{"url":"https://github.com/timhoffm","@type":"Person","name":"timhoffm"},"datePublished":"2025-04-03T12:00:58.000Z","interactionStatistic":{"@type":"InteractionCounter","interactionType":"https://schema.org/CommentAction","userInteractionCount":6},"url":"https://github.com/29863/matplotlib/issues/29863"}
| 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:9560d3f4-4a87-2288-da0b-7cdd58439234 |
| current-catalog-service-hash | 81bb79d38c15960b92d99bca9288a9108c7a47b18f2423d0f6438c5b7bcd2114 |
| request-id | B0B8:17AA66:121DCCA:18C0342:6A5213FB |
| html-safe-nonce | ef01b5fc03697e1a6aebc39ab6ab2c5ccee22ff7c1c91834e53569e006a2a83a |
| visitor-payload | eyJyZWZlcnJlciI6IiIsInJlcXVlc3RfaWQiOiJCMEI4OjE3QUE2NjoxMjFEQ0NBOjE4QzAzNDI6NkE1MjEzRkIiLCJ2aXNpdG9yX2lkIjoiMjk2MDY4ODI2OTM2NzU3OTY0MyIsInJlZ2lvbl9lZGdlIjoiaWFkIiwicmVnaW9uX3JlbmRlciI6ImlhZCJ9 |
| visitor-hmac | ca3557d8ec96e274f955e6502613b106683685e95075dbc27ac93cbd93d14fda |
| hovercard-subject-tag | issue:2969348680 |
| 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/29863/issue_layout |
| twitter:image | https://opengraph.githubassets.com/f959457159531fdbf9e5e388cd2a342ec5f213ef3766cb3e424274927f085334/matplotlib/matplotlib/issues/29863 |
| twitter:card | summary_large_image |
| og:image | https://opengraph.githubassets.com/f959457159531fdbf9e5e388cd2a342ec5f213ef3766cb3e424274927f085334/matplotlib/matplotlib/issues/29863 |
| og:image:alt | Problem When a method with @_preprocess_data raises an exception the decorator shows up in the call stack: ValueError Traceback (most recent call last) Cell In[7], line 6 4 fig, ax = plt.subplots()... |
| og:image:width | 1200 |
| og:image:height | 600 |
| og:site_name | GitHub |
| og:type | object |
| og:author:username | timhoffm |
| 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 | 7aed05249554b889eb33d002851a973eebcc7e91 |
| ui-target | full |
| theme-color | #1e2327 |
| color-scheme | light dark |
Links:
Viewport: width=device-width