1

Python には、辞書を使用して文字列を置換する優れた方法があります。
(辞書を使用するのではなく) 自分のオブジェクトでこれと同じ動作を再現するにはどうすればよいですか?

In [1]: d = {'hello': 'world'}

In [2]: '%(hello)s' % d
Out[2]: 'world'

たとえば、クラスがある場合MyClass:

In [3]: class MyClass():
            a = 'x'
            b = 'y'

In [4]: m = MyClass()

{'a' : 'x'}マッピングがなければ、文字列置換でエラーがスローされることが予想されます (実際にエラーが発生します)が、次のように動作するようにしたいとし'x'ます。

In [5]: '%(a)s' % m
TypeError: format requires a mapping

フォーマット文字列構文 ( __format__)またはテンプレート文字列をいじっていますが、成功していません。

文字列置換で使用する「マッピング」(辞書?) をクラスに提供するにはどうすればよいですか?

4

1 に答える 1

3

インスタンスMyClass()にはそれらに関連付けられた辞書があり、vars()関数でアクセスします。

'%(a)s' % vars(m)

__slots__これは、属性を使用しないすべてのカスタム クラスで機能します。

または、オブジェクトの属性にアクセスできる新しい''.format()文字列フォーマット メソッドを使用することもできます。

'{0.a}'.format(m)

.__format__(format_spec)カスタム クラスのメソッドを検索するのは、このフォーマットのメソッドです。format()関数のドキュメントを参照してください。

最後になりましたが、.__getitem__()メソッドを持つオブジェクトは、辞書のように文字列の書式設定に使用できます。

>>> class Foo(object):
...     def __getitem__(self, name):
...         if name == 'bar': return 'baz'
...         raise AttributeError(name)
... 
>>> '%(bar)s' % Foo()
'baz'
于 2013-03-02T17:05:05.527 に答える