4

eval 関数が \r\n では機能せず、\n で機能する理由。たとえば、 eval("for i in range(5):\r\n print 'hello'") は機能しません eval("for i in range(5):\n print 'hello'") は機能します

replace("\r","") を使用して問題の原因が修正されていないことはわかっていますが、誰かがなぜ起こるのか知っていますか?

--編集-- おお!すみません、まさに、私は幹部を意味していました。POST 経由で HTML テキストエリアから読み取っているため (Linux ボックスを使用しています)、キャリッジ リターンが表示されます。みんなのおかげで、より明確になりました。

4

2 に答える 2

6

あなたは「仕事」の奇妙な定義を持っています:

>>> eval("for i in range(5):\n print 'hello'")
Traceback (most recent call last):
  File "<stdin>", line 1, in <module>
  File "<string>", line 1
    for i in range(5):
      ^
SyntaxError: invalid syntax
>>> 

を使用している理由がわかりませevalexec。Python では、式とステートメントはまったく異なるエンティティです。eval式のみを扱います (そのままの式ステートメントなのでexec、他のステートメントと同様に処理できます)。

に目を向けexec、Python コア コミッターとしての状況を熟考すると、これは小さな設計ミスだと思います: NEWLINE の直前の (冗長で役に立たない) スペース、タブ、およびフォーム フィードは受け入れられ、無視されるのと同じように、(冗長であるのと同じように)無駄です)キャリッジリターンになります。申し訳ありませんが、誰かがキャリッジ リターンをそこに置きたいと考えたことは一度もありませんでした。改行を拒否する理由 (または、他の Unicode 非 ANSI 空白、Python 3 では識別子に任意の Unicode 非 ANSI 英数字を受け入れるようになった)。

気にするなら、Python の問題トラッカーで問題を開いてください。(他のコミッターによる予期せぬ反対がなければ) Python 3.2 で修正できると思います (これは 12 ~ 18 か月でリリースされるはずです。これは推定です [情報に基づいた推測です)。 ]、約束ではありません;-)。

于 2009-07-30T04:37:45.783 に答える
1

evalまたはexecのことですか?実行した内容を正確に投稿し、さらに完全なトレースバックとエラー メッセージを投稿してください。

問題はおそらく、Python の文法で、行は 2 文字のシーケンス '\r\n' ではなく、改行 ('\n') で終了すると言われているためです。

一般に、意味のある '\r' がどこかにある場合は、 replace('\r\n', '\n') を使用する方が安全です。最初に '\r' がなかった方がよいでしょう...どのようにしてテキストを取得していますか? Windows ボックスで読み取られたバイナリー??

安全性について言えば、潜在的な敵から取得した古いコードに対して eval または exec を使用する場合は注意が必要です。

于 2009-07-30T04:03:51.987 に答える