【发布时间】:2012-11-15 18:52:18
【问题描述】:
我正在打印游戏角色对象的统计数据块。在上一个问题中,我展示了一种在 __str__ 函数中使用显示对象数据的方法,如下所示:
def __str__(self):
if self.poisoned is True:
status = "[POISONED]"
else:
status = ""
self.status = status
return ('NAME: {name} {status}\n' \
'XP: {xp}\n' \
'HP: {hit_points}\n' \
'SP: {spell_points}\n' \
'STR: {strength}\n' \
'DEX: {dexterity}\n' \
'WEAPON: {weapon}\n' \
'SPELL: {spell}\n' \
'ITEM: {item}\n' \
'AURA: {aura}\n' \
).format(**self.__dict__)
我要解决的问题与 WEAPON、SPELL、ITEM 和 AURA 变量有关。这些项目在 Character 对象中定义为单个项目列表:weapon=[] 等等。使用上述方法返回列表对象而不是它包含的不带[] 的对象。如果存在而不是[],我会看到一个空白的" " 字符串或列表包含的对象。
NAME: Bones
XP: 0
HP: 100
SP: 100
STR: 14
DEX: 19
WEAPON: []
SPELL: []
ITEM: []
AURA: []
我尝试了许多实验,包括在定义 current_weapon = weapon[0] 后将 {weapon} 引用替换为 {current_weapon},如果列表对象为空,这将不起作用。这只是IndexError: list index out of range 的错误。我可以在对象实例化时生成项目,但这不起作用,因为 self.item 有时会是一个空列表容器。
我可以使用 " " 对象传播列表,但随后必须将它们与替换项目一起处理并跟踪这似乎非常不雅且可能很麻烦。
我似乎无法以一种优雅的方式来打印上面__str__ 返回当前设计的列表对象。我仍在学习 Python,并且我希望有一个简单的添加可以附加到这个 return 字符串来做到这一点。
【问题讨论】:
-
不需要用于续行的反斜杠。
-
谢谢。没有它们,代码看起来好多了。
-
如果列表包含不止一件事,您希望发生什么?
-
我不打算让列表包含超过一个项目。 WEAPON、SPELL 和 AURA 将始终包含一个对象,但 ITEM 将包含一个与其他 3 一样的字符串项目,或者它将是空的(例如在消耗药水时)。所以我在 @987654337 中使用的
return方法@ 应该显示不带括号的项目,如果列表中不存在任何项目供参考,则显示空白。 -
你想通过使用 1 项列表而不是直接持有该项目来完成什么?如果你需要一些“可选”的东西,你可以使用
None来表示玩家没有武器等。
标签: python string function python-3.x string-formatting