[英]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.