python中的字符串格式

Klo*_*erk 5 python string-formatting

最近我一直在做很多基于音乐的编程,因此我发现自己在处理某些歌曲中缺少的元数据方面做了很多这样的事情:

default = {'title': 'Unknown title', 'artist': 'unknown Artist'}
default.update(song)
print '{title} - {artist}'.format(**default)
Run Code Online (Sandbox Code Playgroud)

有更清洁的方法吗?我尝试覆盖__missing__,但缺少键仍然会引发KeyError:

class Song(dict):
    # dictionary with some nice stuff to make it nicer

    def __missing__(self, key):
        return 'Unknown {key}'.format(key = key)
Run Code Online (Sandbox Code Playgroud)

编辑:对不起,我应该更清楚,基本上以下必须工作.

s = Song()
print '{notAKey}'.format(s)
Run Code Online (Sandbox Code Playgroud)

有几个人指出**是没有必要的.

编辑2:我"解决"了我的问题,至少让我感到满意.这是否更清洁是有争议的,但它对我有用.

from string import Formatter

class DefaultFormatter(Formatter):

    def get_value(self, key, args, kwargs):
        # Try standard formatting, then return 'unknown key'

        try:
            return Formatter.get_value(self, key, args, kwargs)
        except KeyError:
            return kwargs.get(key, 'Unknown {0}'.format(key))

class Song(dict):

    def format(self, formatString):
        # Convenience method, create a DefaultFormatter and use it

        f = DefaultFormatter()
        return f.format(formatString, **self)
Run Code Online (Sandbox Code Playgroud)

所以以下内容将返回'Unknown notAKey'

k = Song()
print k.format('{notAKey}')
Run Code Online (Sandbox Code Playgroud)

Dav*_*nan 6

执行摘要:将歌曲封装在一个类中.

听起来像一首歌是你的代码中的主要数据类型,并且值得拥有一个专门的类来表示它.无论如何,使用类内部的dict来存储数据,但尝试移动到比dict更高的抽象级别.

您应该瞄准此课程,以提供支持您对歌曲执行的操作所需的所有服务.保留类中的所有格式代码,以便它不会分散使用歌曲项的代码.实际上,你会发现各种各样的操作都想成为这门课程的方法.

至于格式化的实现,由于你只在一个地方写它,它是否有点啰嗦无关紧要.


Mar*_*riy -1

我更喜欢 Jared 的版本,但如果你真的想自己实现它,这里有一种方法:

>>> class Song(dict):
...     def __getitem__(self, key):
...             if key in self.keys(): return super(Song, self).__getitem__(key)
...             return 'Unknown {key}'.format(key=key)
... 
>>> s = Song()
>>> s['foo']
'Unknown foo'
>>> s['foo'] = 1
>>> s['foo']
1
Run Code Online (Sandbox Code Playgroud)