我有以下课程:
class Enum(RootFragment):
def __init__(self, column, packageName, name, modifiers=["public"], enumValues=[]):
RootFragment.__init__(self, packageName, name, modifiers, "enum")
self.column = column
self.enumValues = []
map(self.addEnumValue, enumValues)
... more methods
现在我创建了一些放入dict的Enum实例。这是打印在print collidingEnums
上的内容:
{'ManagerRole': <Enum instance at 0x0998F080>, 'StaffMemberRole': <Enum instance at 0x0998B490>}
现在因为<Enum instance at 0x0998F080>
不是很有用,我想在每个实例上调用getName
方法。我在努力:
print ", ".join(map(Enum.getName, collidingEnums.items())),
但这给了我一个错误说:
TypeError: unbound method getName() must be called with Enum instance as first argument (got tuple instance instead)
EEH?你如何在这里调用getName
方法?这样可能吗?
答案 0 :(得分:4)
不要使用map
。改为使用生成器表达式:
print ", ".join(i.getName() for i in collidingEnums.values())
或者,您可以简单地为__repr__
类定义自己的Enum
方法,如果您只是尝试打印该类,Python就会使用它来确定您打印的内容。
class Enum(RootFrament):
# ...
def __repr__(self):
return self.getName()
答案 1 :(得分:3)
如果您为__repr__
课程提供Enum
方法,那么它会打印您想要的任何内容,而不是<Enum instance at 0x0998F080>
答案 2 :(得分:1)
您正在元组上调用该方法。如果你使用collidingEnums.itervalues,你将拥有一个Enum对象的生成器。
答案 3 :(得分:1)
我认为比使用“getName”更好的方法是在Enum类上使用 repr , str 或 unicode 函数。
可能是这样的
class Enum():
def getName(self):
return self.name
def __repr__(self):
return self.getName()
答案 4 :(得分:1)
由于在字典items
上返回对(key, value)
,因此无法在该对上调用Enum.getName
。仅在值上调用它,例如
print ", ".join(map(Enum.getName, collidingEnums.values())
如果您想要显示该键,请使用例如lambda
可以处理这两个部分
print ", ".join(map(lambda x: x[0] +":"+ x[1].getName(), collidingEnums.items()))
答案 5 :(得分:1)
您 可以<{1}}使用map
执行此操作
attrgetter
但是,由于您将地图的结果传递给连接,在这种情况下,最好使用带有from operator import attrgetter
print ", ".join(map(attrgetter("getName"), collidingEnums.values()))
的生成器表达式作为Amber建议