16

ConfigParserすべてのセクション、キー、および値が文字列である必要があります。驚くことではありません。getfloatgetint、で値をデータ型に変換するメソッドがありますgetboolean。データ型がわからない場合は、 をラップしget()て、次のeval()ように文字列を評価することができます。

>>> from ConfigParser import SafeConfigParser
>>> cp = SafeConfigParser()
>>> cp.add_section('one')
>>> cp.set('one', 'key', '42')
>>> print cp.get('one', 'key')
'42'
>>> print eval(cp.get('one', 'key'))
42
>>> cp.set('one', 'key', 'None')
>>> print eval(cp.get('one', 'key'))
None
>>> 

より良い方法はありますか?ファイルからのテキストの評価には重大なセキュリティ上の懸念があると思いますが、これは認めます。私はそのファイルを完全に信頼しています。

私はこれを使用すると思っていpickleましたが、設定ファイルを人間が読めるようにしておきたいと思っています。

どのようにしますか?

4

5 に答える 5

16

Python 2.6 以降を使用している場合は、以下を使用できますast.literal_eval

ast.literal_eval(node_or_string)
式ノードまたは Python 式を含む文字列を安全に評価します。提供される文字列またはノードは、次の Python リテラル構造のみで構成されている可能性があります: 文字列、数値、タプル、リスト、辞書、ブール値、およびなし。

これは、値を自分で解析する必要なく、信頼できないソースからの Python 式を含む文字列を安全に評価するために使用できます。

これはeval、文字列が安全な場合のように機能します。

>>> literal_eval("{'key': 10}")
{'key': 10}

ただし、ドキュメントにリストされているタイプ以外のものが表示されると失敗します。

>>> literal_eval("import os; os.system('rm -rf somepath')")
Traceback (most recent call last):
  File "<stdin>", line 1, in <module>
  File "/usr/lib64/python2.6/ast.py", line 49, in literal_eval
    node_or_string = parse(node_or_string, mode='eval')
  File "/usr/lib64/python2.6/ast.py", line 37, in parse
    return compile(expr, filename, mode, PyCF_ONLY_AST)
  File "<unknown>", line 1
    import os; os.system('rm -rf somepath')
         ^
SyntaxError: invalid syntax
于 2011-06-02T00:12:24.063 に答える
1

2.7+ を使用している場合は、.getint .getfloat .getboolメソッドを使用できます。ドキュメントでそれらの詳細を学ぶことができます

したがって、アプリケーションは使用しますprint cp.getint('one', 'key')

于 2013-07-10T20:42:53.713 に答える