私はデータ処理を行うwebappを作っていますので、URLやテキストファイルから文字列を解析することがよくあります。 Pythonの値。Python "safe" eval(文字列をbool/int/float/None/string)
私はevalののより安全なバージョン「のようなもの」である関数を使用する(それは、文字列を読み取ることができない場合、それは文字列のままことを除いて):
def str_to_value(string):
for atom in (True, False, None):
if str(atom) == string:
return atom
else:
try:
return int(string)
except ValueError:
try:
return float(string)
except ValueError:
return string
...しかし、この私には非常に醜いようです。これを行うクリーナーの方法はありますか?私はold discussionのようなものを見つけましたが、素早く簡単な方法(私が知らないライブラリ関数や賢い1ライナーなど)がないのだろうかと思います。
いいえ、私はあなたが許可したい場合は、これらのタイプのいずれかが、これはおそらくそれを行うための方法だと思います。しかし、それは私にとっては奇妙に思えます。入力がどのようなタイプになるのか分かりませんか?あなたは入力をどうするべきかをどのように知っていますか? –
'string'を' str'(そしてサブクラスでもない)と信用しない限り安全ではありません。そうしないと、悪意ある '__eq__'メソッドを使ってクラスを書くことができます。あなたの文字列がTrueのように見えるかどうか。 – katrielalex
Lennart:たとえば、この種の変換を一般的なCsvToDict関数で使用すると、ExpectKeysToBeInts(CsvToDict( "ints_as_keys.csv"))やExpectValuesToBeFloats(CsvToDict( "float_values.csv"))で使用されます。むしろ私のExpectKeysToBeIntsとExpectValuesToBeFloatsは単純なままで、データ変換を気にする必要はありませんでした。 – Emile