[解決済み] f-stringの評価を遅らせるには?
質問
私はいくつかのファイルを生成するためにテンプレート文字列を使用しており、私はこの目的のために新しいf-stringの簡潔さを愛し、私の以前のテンプレートコードをこのようなものから減らすために。
template_a = "The current name is {name}"
names = ["foo", "bar"]
for name in names:
print (template_a.format(**locals()))
これで、直接変数を置き換えて、できるようになりました。
names = ["foo", "bar"]
for name in names:
print (f"The current name is {name}")
しかし、時には、テンプレートを他の場所、つまりコードの上位に定義したり、ファイルか何かからインポートしたりすることが理にかなっていることがあります。これは、テンプレートが静的な文字列で、その中に書式設定タグがあることを意味します。文字列を新しい f-文字列として解釈するようにインタープリタに指示するために、文字列に何かが起こる必要がありますが、そのようなものがあるかどうかはわかりません。
文字列を持ち込んで、それが f-文字列として解釈されるようにする方法はありますか。
.format(**locals())
の呼び出しを避けることができますか?
理想的には、このようなコードを書けるようにしたいのですが...(ここで
magic_fstring_function
は私が理解していない部分です)。
template_a = f"The current name is {name}"
# OR [Ideal2] template_a = magic_fstring_function(open('template.txt').read())
names = ["foo", "bar"]
for name in names:
print (template_a)
...このような出力が期待できます(ファイルを2回読まなくても)。
The current name is foo
The current name is bar
...ですが、実際に得られる出力は
The current name is {name}
The current name is {name}
どのように解決するのですか?
理想2」の完成形です。
これはf-stringではありません-f-stringを使うことさえしません-しかし、要求されたとおりに実行します。指定されたとおりの構文です。を使用していないので、セキュリティ上の問題はありません。
eval()
.
これは小さなクラスを使用し、実装は
__str__
を実装しており、print からは自動的に呼び出されます。クラスの限られた範囲から逃れるために、私たちは
inspect
モジュールを使って1つ上のフレームにホップし、呼び出し元がアクセスする変数を見ることができます。
import inspect
class magic_fstring_function:
def __init__(self, payload):
self.payload = payload
def __str__(self):
vars = inspect.currentframe().f_back.f_globals.copy()
vars.update(inspect.currentframe().f_back.f_locals)
return self.payload.format(**vars)
template = "The current name is {name}"
template_a = magic_fstring_function(template)
# use it inside a function to demonstrate it gets the scoping right
def new_scope():
names = ["foo", "bar"]
for name in names:
print(template_a)
new_scope()
# The current name is foo
# The current name is bar
関連
-
[解決済み】 NameError: グローバル名 'xrange' は Python 3 で定義されていません。
-
[解決済み】 AttributeError: モジュール 'matplotlib' には属性 'plot' がない。
-
[解決済み】IndexError: invalid index to scalar variableを修正する方法
-
[解決済み] プログラムの実行やシステムコマンドの呼び出しはどのように行うのですか?
-
[解決済み] for'ループでインデックスにアクセスする?
-
[解決済み] Pythonで現在時刻を取得する方法
-
[解決済み] バイトを文字列に変換する
-
[解決済み] モジュール名を文字列で指定してインポートするには?
-
[解決済み】ネストされたディレクトリを安全に作成するには?
-
[解決済み】2つの辞書を1つの式でマージする(辞書の和をとる)には?)
最新
-
nginxです。[emerg] 0.0.0.0:80 への bind() に失敗しました (98: アドレスは既に使用中です)
-
htmlページでギリシャ文字を使うには
-
ピュアhtml+cssでの要素読み込み効果
-
純粋なhtml + cssで五輪を実現するサンプルコード
-
ナビゲーションバー・ドロップダウンメニューのHTML+CSSサンプルコード
-
タイピング効果を実現するピュアhtml+css
-
htmlの選択ボックスのプレースホルダー作成に関する質問
-
html css3 伸縮しない 画像表示効果
-
トップナビゲーションバーメニュー作成用HTML+CSS
-
html+css 実装 サイバーパンク風ボタン
おすすめ
-
Pythonの非常に便利な2つのデコレーターを解説
-
Python Decorator 練習問題
-
PythonはWordの読み書きの変更操作を実装している
-
Python interpreted model libraryによる機械学習モデル出力の可視化 Shap
-
Python入門 openを使ったファイルの読み書きの方法
-
[解決済み】RuntimeWarning: invalid value encountered in double_scalars で numpy の除算ができない。
-
[解決済み】DataFrameのコンストラクタが正しく呼び出されない!エラー
-
[解決済み】インポートエラー。モジュール名 urllib2 がない
-
[解決済み】NameError: 名前 'self' が定義されていません。
-
[解決済み】ValueError: xとyは同じサイズでなければならない