繁体   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