簡體   English   中英

如何確定__iter__是由dict還是list調用的?

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

現在,如果我使用listdict ,則會得到:

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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM