我有一个具有很多属性的Python对象(比方说,二十个)。我想把它们中的大约一半放在一个元组中。我会写:
# Sample property names
myTuple = (myObj['one'], myObj['five'], myObj['six'],
myObj['seven'], myObj['nine'], myObj['ten'],
myObj['eleven'], myObj['fifteen'], myObj['twenty'])
问题是,我必须多次重复源对象的名称。是否有更简洁的语法?我会喜欢类似的东西:
# Sample property names
myTuple = myObj[('one', 'five', 'six', 'seven', 'nine',
'ten', 'eleven', 'fifteen', 'twenty')]
答案 0 :(得分:4)
您可以使用docs模块从对象或字典中提取元素。对于使用operator
的对象,dict
使用attrgetter
。它返回一个函数,所以你仍然需要调用它返回的函数,传递你需要从中提取值的对象。
from operator import attrgetter, itemgetter
class X:
def __init__(self, one, two, three):
self.one = one
self.two = two
self.three = three
# for object
x = X(1,2,3)
print(attrgetter('one', 'two')(x))
# for dict
y = {'one': 1, 'two':2, 'three': 3}
print(itemgetter('one', 'two')(y))
返回函数的好处是你可以存储函数并在任意数量的对象上多次调用它。
如果您希望保留getter功能,则只需将其分配给变量
即可e.g。
fn = itemgetter('one', 'two')
fn(y)
# invoke on other dict(s) here
答案 1 :(得分:1)
是的,看一下列表理解。这样的东西非常方便。你也可以为你的类编写一个方法,它接受一个属性列表并在元组中返回它们,在我看来这甚至是一个更好的解决方案。
mytup = tuple([myObj[x] for x in ['one', 'five', 'six', 'seven', 'nine',
'ten', 'eleven', 'fifteen', 'twenty']])
答案 2 :(得分:1)
您可以覆盖对象的__getitem__
方法以实现此替代行为:
class dict2(dict):
def __getitem__(self, k):
if isinstance(k, tuple):
return tuple(self[x] for x in k)
return dict.__getitem__(self, k)
示例:
>>> d=dict2(a=1, b=2, c=4, d=8)
>>> d['a']
1
>>> d['a', 'd']
(1, 8)
>>> d['a', 'b', 'c', 'd']
(1, 2, 4, 8)
请注意,这会阻止您将元组用作键。