2014-01-12 28 views
1

当我有存储各种数据Memory对象的AI程序。 Memory对象有基于被传递给构造自己的“记忆型”不同的参数(现在回想起来,每种类型的内存真的应该一直是Memory一个子类,但这不是重要的时刻)。评估串生产陈述“后”存储在一个字典

我需要建立一个__str__()方法Memory -s。在另一种语言,我可能会做这样的事情:

if self.memtype == "Price": 
    return self.good+" is worth "+self.price+" at "+self.location 
elif self.memtype == "Wormhole": 
    return self.fromsys+" has a wormhole to "+self.tosys 
... 

但是Python的(和快速)的方式做这样的事情是使用类型的字典。问题是,这些字符串在返回之前需要插入值。我想这可以用lambda来完成,但是这让我觉得有点不雅和过于复杂。有没有更好的方法(str.format()突然想起来......)?

回答

5

是,用str.format()

formats = { 
    'Price': '{0.good} is worth {0.price} at {0.location}', 
    'Wormhole': '{0.fromsys} has a wormhole to {0.tosys}', 
} 

return formats[self.memtype].format(self) 

通过self传递作为第一个位置参数,可以在{...}格式化占位符上self解决任何属性。

可以应用更详细的格式的值(如浮点精度,填充,对准等)也一样,看到formatting syntax

演示:

>>> class Demo(): 
...  good = 'Spice' 
...  price = 10 
...  location = 'Betazed' 
...  fromsys = 'Arrakis' 
...  tosys = 'Endor' 
... 
>>> formats = { 
...  'Price': '{0.good} is worth {0.price} at {0.location}', 
...  'Wormhole': '{0.fromsys} has a wormhole to {0.tosys}', 
... } 
>>> formats['Price'].format(Demo()) 
'Spice is worth 10 at Betazed' 
>>> formats['Wormhole'].format(Demo()) 
'Arrakis has a wormhole to Endor'