[英]How to identify if __iter__ is called by dict or list?
我了解的是__iter__
方法使对象可迭代。 如果产生一对,则用dict
调用时会产生dict
。 现在,如果我想创建一个类,该类在使用list调用时创建一个值list
而在使用dict调用时创建一个dict
,该怎么做呢?
可以说该类是这样的:
class Container(object):
def __init__(self):
self.pairs = [
('key1', 'val1'),
('key2', 'val2'),
]
def __getitem__(self, idx):
return self.pairs[idx][1] # return value only
def __iter__(self):
for key, val in self.pairs:
yield key, val
现在,如果我使用list
或dict
,则会得到:
data = Container()
list(data) # [('key1', 'val1'), ('key2', 'val2')]
dict(data) # {'key1': 'val1', 'key2': 'val2'}
我想要的(带有list
)是:
list(data) # ['val1', 'val2']
没有钥匙。
可能吗? 如果是,怎么办?
我认为您必须手动执行列表理解
[v for k, v in data]
这是一个可怕的主意! 但是您可以尝试读取调用行,以查看显式list
构造函数是否正在使用inspect
模块进行调用。 请注意,这仅在调用list
构造函数时有效,并且当正则表达式匹配其不希望匹配的内容时,可能会产生意外结果。
import inspect, re
class Container(object):
def __init__(self):
self.pairs = [
('key1', 'val1'),
('key2', 'val2'),
]
def __getitem__(self, idx):
return self.pairs[idx][1] # return value only
def __iter__(self):
line = inspect.stack()[1][4][0]
# print list(Container())
list_mode = re.match('^.*?list\(.*?\).*$', line) is not None
for key, val in self.pairs:
if list_mode:
yield val
else:
yield key, val
print list(Container()) # ['val1', 'val2']
这不是您想做什么,但我不确定您想做什么是必要的。 让我知道是否可以-尽管我不确定是否可能。 同时:
list_data = [val for key,val in list(data)]
也是搅拌机所说的。 那确实是我的初衷,但我尝试坚持您的要求。 像这样:
def to_list(self):
return [val for key,val in self.pairs]
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.