なぜなぜ1 .__ __(1)を追加すると構文エラーが発生しますか?
1.__add__(1)
歩留まりSyntaxError: invalid syntax
していますか?余分な角括弧は何を追加しますか?
(1).__add__(1)
なぜなぜ1 .__ __(1)を追加すると構文エラーが発生しますか?
1.__add__(1)
歩留まりSyntaxError: invalid syntax
していますか?余分な角括弧は何を追加しますか?
(1).__add__(1)
これはトークナイザの効果である:トークナイザは、可能な限り長いトークンを建てしようとするので、1.__add__(1)
は、トークン"1."
、"__add__"
、"("
、"1"
、および")"
に分割されます。最初のトークンは浮動小数点数で、識別子の直後にはパーサが意味を持ちませんので、SyntaxError
がスローされます。 1.
が有効なフロートがリテラルである
>>> 1 .__add__(1)
2
パーサーは浮動小数点数を見つけることを想定していますが、_
は有効な数字ではありません。括弧は、1
の後に解析を停止するようにパーサーに指示します。
ので、とレクサーは「最大ムンク」ルールに従ってください - 最長一致が使用されます。
は単純に、この作業を行いますドットの前にスペースを追加します。1.
がfloatリテラルとして消費された後、識別子
__add__
と括弧が続きます。すべてのパーサは
<float> <indentifier>
であり、無効である(
1.0 __add__()
を比較すると、同じトークンとなり、構文エラーとなることがわかります)無意味です。第2の例では、式
1
が括弧で囲まれており、
、次にドット(属性アクセス演算子としてパーサによってピックアップされた単一のトークン)等が明らかに有効である。
'1 ..__ add __(1)'も動作します。 –
いいえ、 '1 ..__ add __(1)'はfloatを返しますが、 '(1).__ add __(1)'はintを返します。 – phihag
私はそれが構文エラーではないことを意味しますが、はい。 –