7

というイディオムをよく使います'{var_name}'.format(**vars(some_class))

ただし、プロパティを使用すると、これを使用してプロパティ値を取得できません。

このプログラムを考えてみましょう:

#!/usr/bin/env python

class Foo(object):
    def __init__(self):
        self._bar = None
        self.baz = 'baz here'

    @property
    def bar(self):
        if not self._bar:
            # calculate some value...
            self._bar = 'bar here'
        return self._bar

if __name__ == '__main__':
    foo = Foo()

    # works:
    print('{baz}'.format(**vars(foo)))

    # gives: KeyError: 'bar'
    print('{bar}'.format(**vars(foo)))

質問:

経由でプロパティ値にアクセスできるようにする方法はあります**vars(some_class)か?

4

5 に答える 5

7

短い答え: いいえ、.format(**vars(object))プロパティは使用されず、ドキュメントからも使用されないため、必要なことを行うために使用することはできません:__dict__vars

vars(...)

vars([object])-> 辞書

  • 引数なし、と同等locals()
  • と同等の引数付きobject.__dict__

ただし、属性ルックアップなど、さまざまなフォーマット指定子を使用して、必要なものを実現できます。

In [2]: '{.bar}'.format(Foo())
Out[2]: 'bar here'

.名前に先頭 (ドット)を追加するだけで、必要なものが正確に得られることに注意してください。


補足: を使用する代わりに、次のメソッドを使用.format(**vars(object))する必要があります。format_map

In [6]: '{baz}'.format_map(vars(Foo()))
Out[6]: 'baz here'

引数を指定して呼び出すことは、表記法を使用して呼び出すことと同じですformat_mapが、関数を呼び出す前に展開する必要がないため、より効率的です。dictformat**

于 2013-09-04T11:53:04.073 に答える
1

使用.表記 -

print('{0._bar}'.format(foo))

于 2013-09-04T11:05:41.243 に答える
0

If I understood you correct, something like this should work:

print( eval( 'foo.{bar}'.format( **dict( ( v, v ) for v in dir( foo ) ) ) ) )

But nevertheless this feels somehow "very bad".

于 2013-09-04T11:11:55.453 に答える