[docs] [issue15248] Better explain "TypeError: 'tuple' object is not callable"
Terry J. Reedy
report at bugs.python.org
Wed Mar 21 14:21:20 EDT 2018
Terry J. Reedy <tjreedy at udel.edu> added the comment:
Reviewing Serhiy's patch, I changed my mind from 6 years ago (msg164774). I may have over-estimated the difficulty; in any case the code patch is written. (Tests are still needed.) And the code is rather straightforward and readable.
Beyond that, I see the patch as detecting a SyntaxError during compilation, as explained below, with the hint being frosting on top of that. (It is not an 'Error' as the grammar is now, but it is an error as we might like it to be, hence Serhiy used SyntaxWarning instead.)
In addition, we now have the 'print' precedent of 'print'.
>>> print 1
SyntaxError: Missing parentheses in call to 'print'. Did you mean print(1)?
I don't remember when this was added, but I don't see any mention above.
And it seems from other discussions, like the recent python-ideas thread about possibly deprecating 'string' 'joining', that several people have much more of a problem with missing commas than some of us do.
If it were possible, we would like the 'call' production to be
call ::= callable "(" [argument_list [","] | comprehension] ")"
but 'callable' is not syntactically definable. What is syntactically definable and what Serhiy's patch implements is
possible_callable ::= primary - <obvious exclusions>
call ::= possible_callable ...
As it happens, our grammar metasyntax does not (I believe) include set difference, and I suspect that implementing 'possible_callable' by set addition would result in something that is not LL(1) and possibly ambiguous. Even if 'possible_callable' could be defined within the LL(1) constraint, I suspect it would be messy, and special-casing would still be needed for the special-case message.
Ditto for 'possibly_subscriptable'.
I have 3 questions:
1. Why 'chech' instead of 'check'?
2. Will chech_index catch "[1,2] [3,4]"? (I am guessing that is the intent.)
3. Does Syntax Warning stop compilation, or at least execution, as at a >>> prompt?
Aside from that, I would be inclined to mark this for 'Interpreter Core' and seriously consider it.
versions: +Python 3.8 -Python 2.7, Python 3.3, Python 3.4
Python tracker <report at bugs.python.org>
More information about the docs