5

引数を取らず、文字列形式を使用して呼び出したい文字列を返す関数があります。ここにあり、これが私が使用しようとした方法formatです:

def cabbages():
    return 'hello'

In [2]: '{cabbages} world'.format(**locals())
Out[2]: '<function cabbages at 0x101f75578> world'

In [3]: '{cabbages()} world'.format(**locals())
KeyError: 'cabbages()'

したがって、どちらも私が望むもの、つまり の値ではありませんcabbages()

PEP 3101string.Formatterは、上書きできるいくつかの方法を説明していますが、多くの例を示しているようには見えません。これを行うには、文字列クラスをサブクラス化/カスタマイズするにはどうすればよいFormatterですか?

私が考えたハックなことは、の__getattr__メソッドを上書きすることでありcabbages、「病理学的と見なされる」(または、少なくとも*その*病理学的)ことは本当に望んでいません。

4

2 に答える 2

1

get_fieldのメソッドはFormatter次のように上書きできます。

from string import Formatter
class CallFormatter(Formatter):
    def get_field(self, field_name, *args, **kwargs):
        obj, used_key = Formatter.get_field(self, field_name, *args, **kwargs)
        return obj(), used_key  # obj is the function

fmt = CallFormatter()

In [11]: fmt.format('{cabbages} world', **locals())
Out[11]: 'hello world'

このようなことをすると、健康に関する警告が表示されるため、その PEPのセキュリティに関する考慮事項のセクション全体を貼り付ける価値があると思います(強調を追加)。

歴史的に、文字列の書式設定は、特に文字列の書式設定システムが任意の式を書式文字列に埋め込むことを許可している場合、Web ベースのアプリケーション のセキュリティ ホールの一般的な原因でした。

潜在的なセキュリティ ホールを作成しない方法で文字列の書式設定を使用する最善の方法は、信頼できないソースからの書式文字列を決して使用しないことです。

それを除けば、次善の方法は、文字列の書式設定に副作用がないことを確認することです。Python のオープンな性質のため、重要な操作にこのプロパティがあることを保証することは不可能です。この PEP が行うことは、フォーマット文字列内の式のタイプを、目に見える副作用がまれであり、Python 開発者の文化によって強く推奨されないものに制限することです。したがって、たとえば、属性への単なるアクセスが目に見える副作用を持つコードを記述することは病的と見なされるため、属性アクセスが許可されます (コードに目に見えない副作用 (検索を高速化するためのキャッシュ エントリの作成など) があるかどうかは関係ありません)。 )

于 2013-05-25T18:45:44.340 に答える