Error in Extending/Embedding FAQ, point 16: How do I tell "incomplete input" from "invalid input"?
Steve Holden
steve at holdenweb.com
Wed Apr 23 07:57:24 EDT 2008
Dietrich:
The web maintainers list is pydotorg at python.org. Your message will be
held for moderation, but will be seen by the team who maintain the web site.
regards
Steve
PS: Anyone who wants to *help* maintain the web site should also email
that list. It helps if you are already known to other members of the
Python community, but it's not essential.
Dietrich Bollmann wrote:
> Hi,
>
> I found a solution thanks to another posting on c++-sig and an answer by
> Andreas Klöckner :)
>
> Thank you, Andreas!
>
> The thread is here:
> http://mail.python.org/pipermail/c++-sig/2008-April/thread.html#13470
>
> I would like to inform the responsible of the Python Extending/Embedding
> FAQ, http://www.python.org/doc/faq/extending/ about the broken code in
> the FAQ and the solution I found.
>
> I hope this might prevent other people from the frustration I found
> myself in this morning (...but unfortunately also, at least partly,
> from the joy I am experiencing now, after finding the new solution :).
>
> Does anybody know how to contact the person in charge?
>
> Thanks,
>
> Dietrich
>
> PS:
>
> Of course, I still wonder about the "invalid syntax" error message /
> code I wrote about. But ok, I hope there will be some more adequate
> error message / code some day in the future :)
>
> On Wed, 2008-04-23 at 01:09 +0900, Dietrich Bollmann wrote:
>> On Wed, 2008-04-23 at 00:12 +0900, Dietrich Bollmann wrote:
>>> The following code for example:
>>>
>>> >>> eins = [1,
>>> ... 2,
>>> ... 3]
>>> >>>
>>>
>>> is accepted without any problem by the Python shell.
>>>
>>> When using the code from the FAQ and entering it line by line
>>> already the second line causes a simple "invalid syntax" error:
>>>
>>> >>> eins = [1,
>>> ... 2,
>>> File "<stdin>", line 2
>>> 2,
>>> ^
>>> SyntaxError: invalid syntax
>> By the way - isn't this error message / error code just "wrong" in
>> the given situation and therefor kind of a "bug"?
>>
>> An "end of file" or "incomplete input" error at least would
>> describe the situation much better - and be a better base for
>> functionality which is based the error code also.
>>
>> ---
>>
>> I also thought that I should explain a little bit more exactly,
>> what I am intending to do with the code based on
>> paragraph 16 (How do I tell "incomplete input" from "invalid input"?)
>> of the Extending/Embedding FAQ:
>>
>> I am using Python as scripting language in an application (blender).
>> In order to interface this application from other programs
>> I programmed a python command port / command socket
>> for this application.
>>
>> Between other clients I also wrote a shell client which connects via
>> the command port to the application. My goal is to make it as similar
>> to a normal python shell as possible - and therefor I try to also mimic
>> the "intelligent" way of the Python shell to react to Python input:
>>
>> - when entering a line which is a complete input,
>> it is immediately evaluated by the shell and the
>> result is printed.
>>
>> - when the last entered line is erroneous,
>> an error message is printed immediately
>>
>> - when the input is incomplete, Python waits
>> for other lines to complete the input
>>
>> - when the line is part of a function definition etc.
>> python waits until an empty line is entered
>> before accepting the input as complete.
>>
>> My problem is to understand when an input is erroneous and
>> when it is incomplete - which is impossible with an error message
>> like "invalid syntax"...
>>
>> So here again my question: How can I make the difference
>> between an incomplete and an erroneous input?
>>
>> The code examples in the FAQ worked fine until now - but do not
>> anymore for the current Python implementation.
>>
>> Thanks, Dietrich
>>
>> By the way: Does anybody know who is responsible for the FAQ
>> and could adapt the examples to the current Python version
>> by changing the code / annotating it?
>>
>>
>> On Wed, 2008-04-23 at 00:12 +0900, Dietrich Bollmann wrote:
>> Hi,
>>> Both code examples from paragraph 16 from the Python Extending /
>>> Embedding FAQ - 'How do I tell "incomplete input" from "invalid
>> input"?'
>>> -
>>>
>> ( http://www.python.org/doc/faq/extending/#how-do-i-tell-incomplete-input-from-invalid-input ) do not work with the current state of Python anymore.
>>> In the second code example, the error message returned by Python is
>>> checked in order to differentiate errors caused by an incomplete input
>>> from other syntax errors:
>>>
>>> if (PyArg_ParseTuple (val, "sO", &msg, &obj) &&
>>> !strcmp (msg, "unexpected EOF while parsing")) /* E_EOF */
>>>
>>> In the current Python version there are more error messages indicating
>> an
>>> incomplete Python input and I could make the code work for a while
>>> by adding the following strings to the condition:
>>>
>>> /* error messages indicating an incomplete input */
>>> if (PyArg_ParseTuple(error, "sO", &message, &obj) &&
>>> (!strcmp(message, "unexpected EOF while parsing") ||
>>> !strcmp(message, "expected an indented block") ||
>>> !strcmp(message, "EOF while scanning triple-quoted string")
>>> )
>>> ) { /* E_EOF */
>>>
>>> but recently there are also cases which generate error messages
>>> which are too general to be added to this list.
>>>
>>> The following code for example:
>>>
>>> >>> eins = [1,
>>> ... 2,
>>> ... 3]
>>> >>>
>>>
>>> is accepted without any problem by the Python shell.
>>>
>>> When using the code from the FAQ and entering it line by line
>>> already the second line causes a simple "invalid syntax" error:
>>>
>>> >>> eins = [1,
>>> ... 2,
>>> File "<stdin>", line 2
>>> 2,
>>> ^
>>> SyntaxError: invalid syntax
>>>
>>> which is to general to be integrated into the list of tested
>>> error messages as it might be caused also by code like:
>>>
>>> >>> one two
>>> File "<stdin>", line 1
>>> one two
>>> ^
>>> SyntaxError: invalid syntax
>>>
>>> which generates an "invalid syntax" error even in the Python shell.
>>>
>>> I also tried the first code example of paragraph
>>> '16 How do I tell "incomplete input" from "invalid input"?'
>>> of the FAQ in order to see if it could be used to make the
>>> difference between syntax errors and incomplete code errors.
>>> But - as in the case before - the returned error
>>> code is E_SYNTAX (14 = Syntax error) and not E_EOF (11 = End Of File)
>>> as should be expected.
>>>
>>> Is there anybody who has an idea how to differentiate the
>>> first case from the second in order to mimic the behaviour of
>>> the Python shell from c code?
>>>
>>> If this shouldn't be possible lists split into different lines
>>> couldn't be accepted anymore or the feature of the Python shell
>>> to described in paragraph 16 of the faq:
>>>
>>> Sometimes you want to emulate the Python interactive interpreter's
>>> behavior, where it gives you a continuation prompt when the input
>>> is incomplete (e.g. you typed the start of an "if" statement or you
>>> didn't close your parentheses or triple string quotes), but it
>> gives
>>> you a syntax error message immediately when the input is invalid.
>>>
>>> would have to be given up and every entered line of code would have
>> to
>>> be terminated by an empty line before evaluation :(
>>>
>>> Thanks for any help, Dietrich
>>>
>>>
>>>
>>>
>>
>
> --
> http://mail.python.org/mailman/listinfo/python-list
--
Steve Holden +1 571 484 6266 +1 800 494 3119
Holden Web LLC http://www.holdenweb.com/
More information about the Python-list
mailing list