3

クラスがありCommitます。

class Commit:
    def __init__(self, uid, message):
        self.uid = uid
        self.message = message

    def __str__(self):
        print(self.__dict__)
        return textwrap.dedent('''\
        Commit: {uid}

        {message}
        ''').format(self.__dict__)

これは私には正しいようです。呼び出しNoneの出力からわかるように、両方のキーが存在し、非です。print

{'message': 'Hello, world!', 'uid': 1}

ただし、str.format()リスト行のtoを呼び出すと、が発生しKeyErrorます。

トレースバック(最後の最後の呼び出し):
  ファイル"../Pynewood/pnw"、7行目
    cli(sys.argv)
  ファイル"/Users/daknok/Desktop/Pynewood/pynewood/cli.py"、11行目、CLI
    印刷(コミット)
  ファイル"/Users/daknok/Desktop/Pynewood/pynewood/commit.py"、14行目、__ str__
    ''').format(self .__ dict__)
KeyError:'uid'

キーが辞書に明確に存在しているのに、なぜこのエラーが発生するのですか?

4

2 に答える 2

5

str.format()kwargsを想定しているため、を使用して辞書を拡張する必要があります**

def __str__(self):
    return textwrap.dedent('''\
    Commit: {uid}

    {message}
    ''').format(**self.__dict__)
于 2012-07-21T10:25:29.573 に答える
3

Radek Slupikは正しく、str.format個々のキーワード引数を期待しており、質問のコードでは、フォーマット文字列で拡張されるdict最初の位置引数として単純に渡されます。したがって、使用する必要があります。format{0}str.format(**mapping)

ただし、Python 3.2以降では、代わりに使用できます。と同様に機能しますが、マッピングをに変換しません。これにより、ドキュメントの例のように、カスタムマッピングクラスをに与えることができます。str.format_map(mapping)str.format(**mapping)dictformat

>>> class Default(dict):
...     def __missing__(self, key):
...         return key
...
>>> '{name} was born in {country}'.format_map(Default(name='Guido'))
'Guido was born in country'

また、見た目も良く、パフォーマンスがわずかに向上する可能性があります。

于 2012-07-21T15:37:09.157 に答える