0

私はPython 3.xを学んでいます。入力された値を評価して結果を出力する関数を書きたいと思います。文字列が元々入力されている場合、関数は評価せずに文字列を出力する必要があります。

def eval_input():
    line=input("Something:")
    print(eval(line))

eval_input()

整数と数学演算で問題なく動作します。しかし、" fasdfasd" のような文字列が入力されると、" " というエラーが発生しますname 'fasdfasd' is not defined。このエラーが発生する理由を理解しています。「fasdfasd」は変数と見なされるためです。しかし、文字列が最初に入力されたかどうかを確認する方法がわかりませんか?

評価する前に入力から文字列を埋めるにはどうすればよいですか?

4

3 に答える 3

9

最初: に依存することは、めったに良い考えではありません eval()

NameError単純に(およびSyntaxError同様に) をキャッチして、入力が文字列であると想定することもできます。

try:
    print(eval(line))
except (NameError, SyntaxError):
    print(line)

ここで提起された他の例外があるかもしれませんが、ブランケットやハンドラーeval()の使用を避けるために次に注意したいのは、それらも一般的に良い考えではありません.except:except Exception:

より良いテクニックは、ast.literal_eval代わりに使用することです:

try:
    print(ast.literal_eval(line))
except ValueError:
    print(line)

literal_evalPython リテラル値 (so'string'または123or ) のみを受け入れ、その入力を解析できない場合は('some', 'more', [1, 2, 4.5], 'complex structure')a をスローします。ValueError

セキュリティの問題に悩まされることも、処理する必要があるだけで多くの例外をキャッチする必要もありませeval()ValueError

于 2013-01-10T12:38:36.907 に答える
2

ユーザー入力を取得している場合、おそらく、何を求めているのか、どのタイプであるべきかを知っていると思います。ベリファイアを書く必要があります。これは、正規表現を使用してテキストで行うか、より基本的には「キャスト」または変換関数を使用して行うことができます。

たとえば、整数を探している場合は、 を使用intして変換し、エラーをチェックします。

>>> int("22")
22
>>> int("asdf")
Traceback (most recent call last):
  File "<input>", line 1, in <module>
ValueError: invalid literal for int() with base 10: 'asdf'
>>> 

ユーザーに数字を入力するよう伝えます。このint関数は、解析できない場合は ValueError を発生させますが、それのみであるため、数値以外のものを取得したことが簡単にわかります。

>>> try: 
...     int("asdf")
... except ValueError:
...     print("Enter a number please")
...     

で同じことができますfloat。あなたが得るものinputは常にstrですので、それが必要な場合はそれを使用してください。

于 2013-01-10T12:56:38.183 に答える
0

わかりました、単に答えとしてこれを入れます

try:
    print(eval(line))
except Exception as e:
    print "Something went wrong, namely: %s" % e

しかし、あなたは本当に eval を使いたくありません.eval は悪で厄介で、バグやセキュリティリスクにつながり、適切に開発、デバッグ、使用するのが難しいです.

于 2013-01-10T12:38:27.010 に答える