8

私は通常、次のパターンを使用します(この質問で述べたように):

a=1
s= "{a}".format(**locals())

読みやすいコードを書くのに最適な方法だと思います。

複雑な文字列の作成を「モジュール化」するために、文字列フォーマットを「連鎖」すると便利な場合があります。

a="1"
b="2"
c="{a}+{b}".format(**locals())
d="{c} is a sum".format(**locals())
#d=="1+2 is a sum"

すぐに、コードはX.format(**locals()). この問題を解決するために、ラムダを作成しようとしました。

f= lambda x: x.format(**locals())
a="1"
b="2"
c= f("{a}+{b}")
d= f("{c} is a sum")

しかしlocals()、ラムダのローカルであるため、これは KeyError をスローします。

また、最後の文字列にのみフォーマットを適用しようとしました:

a="1"
b="2"
c="{a}+{b}"
d="{c} is a sum".format(**locals())
#d=="{a}+{b} is a sum"

しかし、Python は 1 回しかフォーマットしないため、これは機能しません。これで、何もすることがなくなるまで繰り返しフォーマットする関数を書くことができます。

def my_format( string, vars ):
    f= string.format(**vars)
    return f if f==string else my_format(f, vars)

しかし、私は疑問に思っています:これを行うためのより良い方法はありますか?

4

4 に答える 4

4

f = lambda x, l=locals(): x.format(**l)動作するように見えます...

そして、もう少し包括的なバージョンが必要な場合(そしておそらくはるかに遅い):

fg = lambda x, l=locals(), g=globals(): x.format(**dict(g.items() + l.items()))

ローカルまたはグローバルのいずれかでシンボルを検索します。

于 2013-10-23T18:55:30.977 に答える
2

関数スコープ内でローカル ショートカットとしてのみこれを行う必要がある場合は、次のようにします。

def formatter(fmt, loc=locals()):
    return fmt.format(**loc)

ただし、これはlocals()関数の実行時ではなく宣言時に返される値をバインドするため、値が変更されても更新されず、他のスコープから呼び出されたときにも役に立ちません。

呼び出し元のメソッドにアクセスするには、コール スタック ( http://docs.python.org/2/library/inspect.html )localsが必要です。inspect

import inspect

def formatter(fmt):
    parent = inspect.stack()[1][0] # 1 = the previous frame context
                                   # 0 = the frame object
    return fmt.format(**parent.f_locals)

これは、CPython ではない python の実装では機能しない可能性があることに注意してください。

これで、次のことができます。

a = "1"
b = "2"
c = formatter("{a}+{b}")
d = formatter("{c} is a sum")
于 2013-10-23T20:56:55.657 に答える