質問

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"、"")を使用した問題の原因は修正されていませんが、誰かが原因を知っていますか?

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

役に立ちましたか?

解決

" work"の奇妙な定義があります:

>>> 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
>>> 

eval を使用している理由がわからない- exec を意味すると思われます。 Pythonでは式とステートメントは大幅に異なるエンティティです。 eval は式のみを処理します(裸の式 はステートメントでもあるため、 exec は処理できます他のステートメントと同様に)。

exec に目を向けて、Pythonコアコミッターとしての状況を熟考しているのは、マイナーな誤設計だと思います:ちょうど改行の前の(冗長で無用な)スペース、タブ、フォームフィードのように受け入れられて無視されるため、(冗長で無駄な)キャリッジリターンが必要です。謝罪:誰かがそこに改行を入れたいと思ったことは一度もなかったと思いますが、それでも、例えば、そこにフォームフィードがあり、 that を受け入れます...そのため、キャリッジリターン(または他のUnicode非ANSI空白も拒否する理由はありません。Python3では、任意のUnicode非識別子のANSI英数字)。

気になる場合は、Pythonの課題追跡システムで問題を開いてください(他のコミッターによる予期しない反対を除けば)Python 3.2で修正できると思います(12〜18か月以内に公開されるはずです-これは推定値です) [情報に基づく推測]、約束ではありません;-)。

他のヒント

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

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

一般に、どこかに意味のある「\ r」がある場合は、replace( '\ r \ n'、 '\ n')を使用する方が安全です。そもそも '\ r'がなかったらもっといいだろう...どのようにテキストを取得しているのか-Windowsボックスでバイナリを読む??

安全性については、可能性のある敵から取得した古いコードでevalまたはexecを使用することに注意する必要があります。

ライセンス: CC-BY-SA帰属
所属していません StackOverflow
scroll top