type (3.) <type 'float'> 3..__class__ <type 'float'> type(3) <type 'int'> 3.__class__ File "<stdin>", line 1 3.__class__ ^ SyntaxError: invalid syntax
Superficially the last example ought to be legal syntax (and return <type 'int'>). Is it an oversight which could be fixed in a straightforward way, or are there reasons why it can't? I have tested this with Python 2.5 and Python 3.2. Best wishes Rob Cliffe
On Mon, Apr 25, 2011 at 1:21 PM, Rob Cliffe <rob.cliffe@btinternet.com> wrote: ..
3.__class__ File "<stdin>", line 1 3.__class__ ^ SyntaxError: invalid syntax
Superficially the last example ought to be legal syntax (and return <type 'int'>).
If it was valid, then
3.e+7
would have to raise an attribute error instead of
3.e+7 30000000.0
On Tue, Apr 26, 2011 at 3:21 AM, Rob Cliffe <rob.cliffe@btinternet.com> wrote:
type (3.) <type 'float'> 3..__class__ <type 'float'> type(3) <type 'int'> 3.__class__ File "<stdin>", line 1 3.__class__ ^ SyntaxError: invalid syntax
Superficially the last example ought to be legal syntax (and return <type 'int'>). Is it an oversight which could be fixed in a straightforward way, or are there reasons why it can't?
The parser (or is it the lexer? I never remember which it is that has the problem in this case) can't handle it - it sees the first "." and expects a floating point value. It's hard to disambiguate due to 3.e10 and the like being valid floating point numbers, while 3..e10 has to be an attribute access. You have to use whitespace or parentheses to eliminate the ambiguity: 3. __class__ (3).__class__ Cheers, Nick. -- Nick Coghlan | ncoghlan@gmail.com | Brisbane, Australia
On 4/25/2011 1:21 PM, Rob Cliffe wrote:
type (3.) <type 'float'> 3..__class__ <type 'float'> type(3) <type 'int'> 3.__class__ File "<stdin>", line 1 3.__class__ ^ SyntaxError: invalid syntax
Superficially the last example ought to be legal syntax (and return <type 'int'>).
You are a more sophisticated parser than Python, which is limited to LL(1) parsing. (No that is not in the manual, but it is a known design consraint.)
Is it an oversight which could be fixed in a straightforward way, or are there reasons why it can't?
This sort of question as to why Python is the way it is really belongs on python-list. 3.x is parsed as (3.)x (float 3. followed by x) which is invalid syntax unless 'x' is a digit(s). You automatically back up and reparse as 3(.x) 3 .0 is a syntax error. 3 .__class__ is int. -- Terry Jan Reedy
participants (4)
-
Alexander Belopolsky
-
Nick Coghlan
-
Rob Cliffe
-
Terry Reedy