cpython icon indicating copy to clipboard operation
cpython copied to clipboard

gh-85267: Improvements to inspect.signature __text_signature__ handling

Open hauntsaninja opened this issue 2 years ago • 2 comments

This makes a couple related changes to inspect.signature's behaviour when parsing a signature from __text_signature__.

First, inspect.signature is documented as only raising ValueError or TypeError. However, in some cases, we could raise RuntimeError. This PR changes that, thereby fixing #83685.

(Note that the new ValueErrors in RewriteSymbolics are caught and then reraised with a message)

Second, inspect.signature could randomly drop parameters that it didn't understand (corresponding to return None in the p function). This is the core issue in #85267. I think this is very surprising behaviour and it seems better to fail outright.

Third, adding this new failure broke a couple tests. To fix them (and to e.g. allow inspect.signature(select.epoll.register) as in #85267), I add constant folding of a couple binary operations to RewriteSymbolics.

(There's some discussion of making signature expression evaluation arbitrary powerful in #68155. I think that's out of scope. The additional constant folding here is pretty straightforward, useful, and not much of a slippery slope)

Fourth, while #85267 is incorrect about the cause of the issue, it turns out if you had consecutive newlines in __text_signature__, you'd get tokenize.TokenError.

Finally, the if name is invalid: code path was dead, since parse_name never returned invalid.

  • Issue: gh-85267

hauntsaninja avatar Oct 28 '22 07:10 hauntsaninja

The tokenize.TokenError fix could be made its own PR, but the other changes are somewhat linked.

hauntsaninja avatar Oct 28 '22 07:10 hauntsaninja

Thanks! Made the requested changes. I agree that this seems backport-able

hauntsaninja avatar Nov 09 '22 06:11 hauntsaninja

Deploy Preview for python-cpython-preview canceled.

Name Link
Latest commit fef97874bc90541d0e0ea8a1ed807284bc895c58
Latest deploy log https://app.netlify.com/sites/python-cpython-preview/deploys/6396ac051af5c300087493ef

netlify[bot] avatar Dec 12 '22 04:12 netlify[bot]

#21104 did a subset of what this PR is changing, fixed the merge conflict.

JelleZijlstra avatar Dec 12 '22 04:12 JelleZijlstra

Thanks @hauntsaninja for the PR, and @JelleZijlstra for merging it 🌮🎉.. I'm working now to backport this PR to: 3.10, 3.11. 🐍🍒⛏🤖 I'm not a witch! I'm not a witch!

miss-islington avatar Dec 21 '22 03:12 miss-islington

Sorry, @hauntsaninja and @JelleZijlstra, I could not cleanly backport this to 3.11 due to a conflict. Please backport using cherry_picker on command line. cherry_picker 79311cbfe718f17c89bab67d7f89da3931bfa2ac 3.11

miss-islington avatar Dec 21 '22 03:12 miss-islington

Sorry @hauntsaninja and @JelleZijlstra, I had trouble checking out the 3.10 backport branch. Please retry by removing and re-adding the "needs backport to 3.10" label. Alternatively, you can backport using cherry_picker on the command line. cherry_picker 79311cbfe718f17c89bab67d7f89da3931bfa2ac 3.10

miss-islington avatar Dec 21 '22 03:12 miss-islington

@hauntsaninja do you want to do the manual backports?

JelleZijlstra avatar Dec 21 '22 03:12 JelleZijlstra

GH-100392 is a backport of this pull request to the 3.11 branch.

bedevere-bot avatar Dec 21 '22 03:12 bedevere-bot

GH-100393 is a backport of this pull request to the 3.10 branch.

bedevere-bot avatar Dec 21 '22 03:12 bedevere-bot

Done! Conflicts were because of #21104

  • https://github.com/python/cpython/pull/100392
  • https://github.com/python/cpython/pull/100393

hauntsaninja avatar Dec 21 '22 04:12 hauntsaninja

Thank you!

JelleZijlstra avatar Dec 21 '22 05:12 JelleZijlstra