2012-01-05 9 views
2

いくつかの設定ファイルの素早くハックな構文解析を行うスクリプトを(少し)改善しようとしています。文字列リテラルを含む文字列を、それが表す文字列に簡単に変換できますか?

ファイルから読み取った「項目」を認識すると、単純なpython値に変換する必要があります。値は数値または文字列です。それは実際には数ではなかった場合、私はちょうどintまたはfloatを使用してValueErrorをキャッチすることができますPythonの番号にファイルから読み込んだ文字列を変換するには

。 Pythonの文字列に似たものがありますか?すなわち

s1 = 'Goodbye World. :(' 
s2 = repr(s1) 
s3 = ' "not a string literal" ' 
s4 = s3.strip() 

v1 = parse_string_literal(s1) # throws ValueError 
v2 = parse_string_literal(s2) # returns 'Goodby World. :(' 
v3 = parse_string_literal(s3) # throws ValueError 
v4 = parse_string_literal(s4) # returns 'not a string literal' 

ファイルでは、文字列値はPython文字列リテラルと非常によく似ています。 'または'で引用することができ、バックスラッシュのエスケープなどが含まれている可能性があります。正規表現を使用して独自のパーサをロールすることはできますが、すでに存在するものがあれば、ホイールを再発明しません。

もちろんevalを使用しますが、それは常にやや危険だ。

答えて

4

...そして案の定、私が掲示した後、私は答えを見つけた。

私が探していたよりもさらに良いast.literal_evalast — Abstract Syntax Trees

リテラルだけからなるPython式を評価することができます。また、設定ファイルから、数値や文字列である可能性のある項目を複数のコンバージョンを試みることなく認識でき、ValueError例外で次のコンバートに落ちることも意味します。私はアイテムがどんなタイプであるか把握する必要さえしない。

それは私が項目がのみ数または文字列でしたが、私がいないことを確認することを気にあれば問題になる可能性がある、でも道より柔軟な私は必要以上だ:

>>> ast.literal_eval('{"foo": [23.8, 170, (1, 2, 3)]}') 
{'foo': [23.8, 170, (1, 2, 3)]} 
+0

ああ、 1つの笑い声。文字列がリテラル式として解析できない場合は、少なくとも 'SyntaxError'と' IndentationError'と 'ValueError'を投げることができます。それがあれば誰でも知っていますか、それとももっと可能性のある例外がありますか? – Ben

2

ast.literal_eval()はすべて、単純なPythonのリテラル、およびほとんどの複合リテラルを処理します。

関連する問題