【发布时间】:2017-11-09 21:18:38
【问题描述】:
今天我正在学习使用 * 和 ** 来解包参数。
我发现list、str、tuple、dict都可以被*解包。
我猜是因为它们都是可迭代的。所以我自己做了一个类。
# FILE CONTENT
def print_args(*args):
for i in args:
print i
class MyIterator(object):
count = 0
def __iter__(self):
while self.count < 5:
yield self.count
self.count += 1
self.count = 0
my_iterator = MyIterator()
# INTERPRETOR TEST
In [1]: print_args(*my_iterator)
0
1
2
3
4
有效!但是如何在 python 中创建一个像 dict 这样的 mapping 对象,以便 ** 解包工作呢?有可能这样做吗?除了dict之外,python中是否已经存在另一种mapping对象?
PS:
我知道我可以让一个对象继承自 dict 类以使其成为映射对象。但是是否有一些关键的magic_method 像__iter__ 来制作没有类继承的映射对象?
PS2:
在@mgilson 的回答的帮助下,我制作了一个可以由** 解包的对象,而无需从当前映射对象继承:
# FILE CONTENT
def print_kwargs(**kwargs):
for i, j in kwargs.items():
print i, '\t', j
class MyMapping(object):
def __getitem__(self, key):
if int(key) in range(5):
return "Mapping and unpacking!"
def keys(self):
return map(str, range(5))
my_mapping = MyMapping()
print_kwargs(**my_mapping)
# RESULTS
1 Mapping and unpacking!
0 Mapping and unpacking!
3 Mapping and unpacking!
2 Mapping and unpacking!
4 Mapping and unpacking!
请注意,使用** 解包时,映射对象中的键应为str 类型,否则会引发TypeError。
【问题讨论】:
-
你可以使用
collections模块的Abstract Base Classescollections.Mapping和collections.MutableMapping来定义你自己的不继承自dict的映射类。
标签: python dictionary mapping