【问题标题】:OrderedDict won't sort within a classOrderedDict 不会在一个类中排序
【发布时间】:2014-12-30 17:22:03
【问题描述】:

我有一个父类,我想保留其子类的所有实例的注册表(以字典的形式)。很简单,但我希望注册表根据其键对自身进行排序,这些键是初始化时 2 个子类的参数。这是我的简化代码:

from collections import OrderedDict

class Parent:
    _registry = OrderedDict()
    def __init__(self):
        # add each sub-class instance to the registry & sort the registry
        self._registry.update({self._num:self})
        self._registry = OrderedDict(sorted(self._registry.items()))

class Foo(Parent):
    def __init__(self, number):
        self._num = number
        Parent.__init__(self)
        # then do some stuff

class Bar(Parent):
    def __init__(self, number):
        self._num = number
        Parent.__init__(self)
        # then do some other stuff
...

但是,虽然注册中心会使用新的子类对象更新自己,但它不会自行排序。

>>> a = Foo(3)
>>> Parent._registry # check to see if a was added to the registry
OrderedDict([(3, <Foo instance at 0x00A19C0C8>)])
>>> b = Bar(1)
>>> Parent._registry # check to see if b was inserted before a in the registry
OrderedDict([(3, <Foo instance at 0x00A19C0C8>), (1, <Bar instance at 0x00A19C1C8>)])

b 在注册表中位于a 之后!

如果我在 iPython 控制台中手动操作,它可以工作:

>>> Parent._registry = OrderedDict(sorted(Parent._registry.items()))
OrderedDict([(1, <Bar instance at 0x00A19C1C8>), (3, <Foo instance at 0x00A19C0C8>)])

为什么它不会自行排序?我需要它,因为稍后,这些对象必须按照它们的 number 参数的严格顺序发生。

【问题讨论】:

    标签: python class dictionary ordereddictionary


    【解决方案1】:

    那是因为:

    self._registry = OrderedDict(sorted(self._registry.items()))
    

    在实例上创建一个新属性,这不会影响Parent._registry

    将该行替换为:

    Parent._registry = OrderedDict(sorted(self._registry.items()))
    

    这里self._registry.items() 可以获取Parent._registry 的值,但这并不意味着分配给self._registry 会影响Parent._registry


    使用self._registry 本身的另一种方法:

    def __init__(self):
        items = sorted(self._registry.items() + [(self._num, self)]) #collect items
        self._registry.clear() #clean the dict
        self._registry.update(items) #now update it
    

    【讨论】:

    猜你喜欢
    • 2021-12-07
    • 2020-02-07
    • 1970-01-01
    • 1970-01-01
    • 2011-12-23
    • 1970-01-01
    • 2016-12-12
    • 2011-10-04
    • 1970-01-01
    相关资源
    最近更新 更多