2013-05-14 2 views
15

キーワードの前後にスペースが含まれないことがあるのはなぜですか?たとえば、式2if-1e1else 1が有効な理由は何ですか?なぜPythonは常にキーワードの周りにスペースを必要としませんか?

はCPython 2.7および3.3の両方で動作するように思われる:

$ python2 
Python 2.7.3 (default, Nov 12 2012, 09:50:25) 
[GCC 4.2.1 Compatible Apple Clang 4.1 ((tags/Apple/clang-421.11.66))] on darwin 
Type "help", "copyright", "credits" or "license" for more information. 
>>> 2if-1e1else 1 
2 

$ python3 
Python 3.3.0 (default, Nov 12 2012, 10:01:55) 
[GCC 4.2.1 Compatible Apple Clang 4.1 ((tags/Apple/clang-421.11.66))] on darwin 
Type "help", "copyright", "credits" or "license" for more information. 
>>> 2if-1e1else 1 
2 

ともPyPyで:

したがって
identifier ::= (letter|"_") (letter | digit | "_")* 

2if:Pythonで

$ pypy 
Python 2.7.2 (341e1e3821ff, Jun 07 2012, 15:42:54) 
[PyPy 1.9.0 with GCC 4.2.1] on darwin 
Type "help", "copyright", "credits" or "license" for more information. 
And now for something completely different: ``PyPy 1.6 released!'' 
>>>> 2if-1e1else 1 
2 
+0

wtf – wim

+0

perlのように見え始めています – jamylak

答えて

12

識別子は次のように記載されています識別子にすることはできないため、2if。同様のロジックが残りの式に適用されます。

基本的には(完全な解析が非常に複雑になります)このような何かを行くだろう2if-1e1else 1の解釈:

2ifない有効な識別子、2が数字digit ::= "0"..."9"にマッチし、ifは、キーワードに一致します。 -1e1else-1の単項否定(u_expr ::= power | "-" u_expr | "+" u_expr | "~" u_expr)です:

>>> type(2e3) 
<type 'float'> 
(。 exponentfloat ::= (intpart | pointfloat) | exponentintpartと一致する 1e1が指数 exponent ::= ("e" | "E") ["+" | "-"] digit+である)あなたは、フォーム Ne+|-xの表情を見ることができるからフロートこれを生み出します

の場合はelseがキーワードとみなされ、-1などとなります。

詳細については、を参照してください。

+0

* "...' -1'は 'intpart'と一致します..." * wait、何? '-'は単項演算子ではありませんか? – Mehrdad

+0

どのように構文解析されているかを示すために文法をバストします。いい感じです。 – squiguy

+0

@Mehrdad申し訳ありませんが、編集がはっきりしていますか? – HennyH

関連する問題