私はPython3を取得しようとしていましたast.literal_eval()関数は(対話的なPythonセッションで)動作しますが、私はできない。この安全な代替とPythonのast.literal_eval( 'a_string')による支援
>>> import logging
>>> eval('logging.DEBUG')
10
:
>>> import logging, ast
>>> ast.literal_eval('logging.DEBUG')
Traceback (most recent call last):
...
ValueError: malformed node or string: <_ast.Attribute object at 0x7f1ccc55eeb8>
が、後者は(少なくとも私はそれを使用していないか)は動作しません
私の目標は、これを交換することです。私もと二重引用とraw-stringのバリエーションも試しました。
ここではニュアンスが足りないと思います(モジュール内の定数の評価が嫌いなど)。 ast.literal_eval()にはPython-3ドキュメントから:
安全に式ノードやPython リテラルまたはコンテナ表示を含むストリングを評価します。提供される文字列またはノードは、文字列、バイト、 数字、タプル、リスト、辞書、集合、ブール値、およびNoneというPythonのリテラル構造で構成されている場合のみ になります。
これは、 の値を解析する必要なく、信頼できないソースからのPython 値を含む文字列を安全に評価するために使用できます。演算子や索引付けなど、任意の複雑な式 の式を評価することはできません。
助けてください。 = :)事前にありがとう!あなたがコメントに与える文脈で
私は、あなたが 'literal_eval'の* literal *部分を誤解していると思います。 'literal_eval(" 'logging.DEBUG' ")' - > ''logging.DEBUG''です。リテラル(文字列、タプル、辞書、数字など)だけを評価し、同じデータ型を文字列展開として渡すことができます。それはちょっとのポイントです。 – timgeb
ありがとうございます。私はそのシナリオも試みました(まさにリテラルな表現のためです)。 :)。私は、eval()よりも安全なものを使用するための構文を取得しようとしていると思います(ここでは不可能かもしれません)。以前はどこかにsafe_evalがあった。しかし、私はこれを最初に試みています。 –
もう少しのコンテキスト:configparser.SafeConfigParser()を使用してk/vペアを取得しています:log_level = "logging.DEBUG"。もちろん、文字列(リテラルではありません)を指す識別子が得られます。それにもかかわらず、ログレベルの整数値に評価する必要があります。 eval()は動作しますが、私はそれを使用したくないです。私が郵便で言及したように、それはここでは不可能かもしれないが、私はコミュニティに尋ねたいと思った。 :) –