2016-03-31 7 views
3

私は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 値を含む文字列を安全に評価するために使用できます。演算子や索引付けなど、任意の複雑な式 の式を評価することはできません。

助けてください。 = :)事前にありがとう!あなたがコメントに与える文脈で

+4

私は、あなたが 'literal_eval'の* literal *部分を誤解していると思います。 'literal_eval(" 'logging.DEBUG' ")' - > ''logging.DEBUG''です。リテラル(文字列、タプル、辞書、数字など)だけを評価し、同じデータ型を文字列展開として渡すことができます。それはちょっとのポイントです。 – timgeb

+0

ありがとうございます。私はそのシナリオも試みました(まさにリテラルな表現のためです)。 :)。私は、eval()よりも安全なものを使用するための構文を取得しようとしていると思います(ここでは不可能かもしれません)。以前はどこかにsafe_evalがあった。しかし、私はこれを最初に試みています。 –

+0

もう少しのコンテキスト:configparser.SafeConfigParser()を使用してk/vペアを取得しています:log_level = "logging.DEBUG"。もちろん、文字列(リテラルではありません)を指す識別子が得られます。それにもかかわらず、ログレベルの整数値に評価する必要があります。 eval()は動作しますが、私はそれを使用したくないです。私が郵便で言及したように、それはここでは不可能かもしれないが、私はコミュニティに尋ねたいと思った。 :) –

答えて

4

、私はそれをしないあなたをアドバイス:

  • logging.Debugがlitteralではありませんので、あなたがast.literal_evalを使用することはできません:あなたは、モジュールから値を尋ねると、それは任意のかもしれません副作用
  • 外部ファイルから読み込まれた値にevalを使用しないでください。

私のアドバイスは、マップを使用することです:

log_levels = { 'DEBUG': logging.DEBUG, ... } 

後で、あなたの設定ファイルから(DEBUGを言う)log_levelをあなただけのか読んだとき:

real_level = log_levels[log_level] 

そうすればあなたreal_level = log_levels[log_level.upper()]でケースエラーを簡単に受け入れることができます。また、設定ファイルに予期しない値があると、望ましくない評価のリスクなしでKeyError例外が発生します。

+0

こんにちは。 @timgebが最初に(彼のコメントで)暗示したように、私はすでにデバッグレベルの実装を実装していました(モジュールで定義されていますが、これは私の一般的なアプローチです)。しかし、これについて尋ねたかった。私はdictに戻るだろうと思う。私は解決策をチェックするために回り回るつもりですが、一方で、私はあなたの答えとtimgebのコメントも(両方とも)アップビートしました。ありがとう。 –