【问题标题】:Is iterating over self a bad practice?迭代自我是一种不好的做法吗?
【发布时间】:2019-02-06 21:54:14
【问题描述】:
class Data:
    def __init__(self, dictionary):
        self.data = dictionary

    def __iter__(self):
        for key,val in self.data.items():
            yield (key, val)

    def iter_on_self(self):
        for i in self:
            yield i

我知道上面的iter_on_self 是多余的,但我想知道for i in self: #do something 是否被认为是一种不好的做法。如果这是一种不好的做法,并且我需要从同一个类中的另一个方法对 self 进行循环,那么我将如何实现它。

【问题讨论】:

  • __iter__ 中的循环将引发ValueError: Not enough arguments to unpack。循环遍历self.data 只会给你密钥,除非你说for k, v in self.data.items()
  • 我的错,我的意思是for key,val in self.data.items()

标签: python loops iterator


【解决方案1】:

没有。为什么会这样?您定义__iter__ 的原因是您可以迭代您的对象。我认为当它已经存在时重新实现它是不好的做法。

这是您描述的在 standard library python object (OrderedDict) 中使用的行为示例。

def __reduce__(self):
    'Return state information for pickling'
    items = [[k, self[k]] for k in self]
    tmp = self.__map, self.__root
    del self.__map, self.__root
    inst_dict = vars(self).copy()
    self.__map, self.__root = tmp
    if inst_dict:
        return (self.__class__, (items,), inst_dict)
    return self.__class__, (items,)

【讨论】:

    猜你喜欢
    • 2019-09-09
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-12-22
    • 2019-01-24
    • 1970-01-01
    • 2011-10-23
    • 2018-10-03
    相关资源
    最近更新 更多