Invalid identifier claimed to be valid by docs (methinks)

Terry Reedy tjreedy at udel.edu
Sun Sep 23 22:42:35 EDT 2012


On 9/23/2012 6:57 PM, Ian Kelly wrote:
> On Sun, Sep 23, 2012 at 4:24 PM, Joshua Landau
> <joshua.landau.ws at gmail.com> wrote:
>> The docs describe identifiers to have this grammar:
>>
>> identifier   ::=  xid_start xid_continue*
>> id_start     ::=  <all characters in general categories Lu, Ll, Lt, Lm, Lo,
>> Nl, the underscore, and characters with the Other_ID_Start property>
>> id_continue  ::=  <all characters in id_start, plus characters in the
>> categories Mn, Mc, Nd, Pc and others with the Other_ID_Continue property>
>> xid_start    ::=  <all characters in id_start whose NFKC normalization is in
>> "id_start xid_continue*">

xid_start is a subset of id_start

>> xid_continue ::=  <all characters in id_continue whose NFKC normalization is
>> in "id_continue*">

xid_continue is a subset of id_continue.

>> So I would assume that
>>      exec("a{} = None".format(char))
>> would be valid if
>>     unicodedata.normalize("NFKC", char)  == "1"

Read more carefully the definition of xid_continue. The un-normalized 
character must also be in id_continue.

>> as
>>     exec("a1 = None")
>> is valid.
>>
>> BUT "a¹ = None" is not valid*.

 >>> ud.category("\u00b9")
'No'

Category No is *not* in id_continue, and therefore not in xid_continue.

> exec("x\u00b9 = None")  # U+00B9 is superscript 1
>
> On the other hand, this does work:
>
> exec("x\u2071 = None")  # U+2071 is superscript i
>
> So it seems to be only an issue with superscript and subscript digits.
>   Looks like a compiler bug to me.

The problem, if there were one, would be in the tokenizer that finds 
identifiers. However,

 >>> exec("x\u00b9 = None")
...
     x¹ = None
       ^
SyntaxError: invalid character in identifier

this is correct.

-- 
Terry Jan Reedy





More information about the Python-list mailing list