2

私はPEP 498に取り組んでいます。概念がよくわからないかもしれませんが、通常の Python 文字列をフォーマットされた文字列リテラルに変換し、実行時に評価するにはどうすればよいでしょうか?


次の文字列があるとします。

some_string = 'Name: {name}'

フォーマットされた文字列リテラルの場合、次のように動作します。

name = 'Demo'
some_string_literal = f'Name: {name}'
some_string_literal == 'Name: Demo' # returns True

これがまったく意味があるかどうかという問題を無視して、たとえばsome_string、実行時にファイルからコンテンツを読み取り、それを変換some_string_literalして評価するにはどうすればよいでしょうか? 基礎となる CPython 実装についての私の理解では、文字列リテラルはコンパイル時に解釈されます (バイトコードへの変換)。

...を使用するだけの、より「明示的な」オプションを認識しています。

some_string = 'Name: {name}'
some_string.format(name = 'Demo') == 'Name: Demo' # returns True

...しかし、これは私が探しているものではありません。


編集:「明示的な」オプションが私が探しているものであることがコメントに記載されてました。私がここで求めていることは、多くの点で間違いなく安全ではないことに同意します。それにもかかわらず、これを行う方法があるかどうかに興味があります。

4

1 に答える 1

1

PEP 498 言う

コンパイラは、補間された文字列に含まれる式の評価に関与する必要があるため、どの文字列を評価する必要があるかをコンパイラに示す何らかの方法が必要です。

つまり、文字列リテラルが解析される方法にf影響を与えます。したがって、補間を機能させるにはパーサーを呼び出す必要があります。r

some_stringデータを読み取り、文字列として解析できる文字列リテラルに変換したいとしますf。これは、データを読み込んsome_lambda_expressionでラムダ式に変換することと大差ありません。もちろん、パーサーを呼び出して文字列変数の内容をコードに変換する方法evalであるため、 を使用してそれを行うことができます。eval私はそれがあなたが望んでいたものではないことを知っています。ただし、パーサーを呼び出さに-stringsome_stringとして解析することはできないため、必要なものを取得できません。f

于 2018-04-17T08:32:04.217 に答える