backtrader.utils.ordereddefaultdict 源代码

#!/usr/bin/env python
"""Ordered Default Dict Module - OrderedDict with default values.

This module provides OrderedDefaultdict, which combines the insertion
ordering of OrderedDict with the default value functionality of defaultdict.

Classes:
    OrderedDefaultdict: OrderedDict that creates default values for missing keys.

Example:
    >>> from backtrader.utils import OrderedDefaultdict
    >>> d = OrderedDefaultdict(list)
    >>> d['key'].append('value')
    >>> print(d['key'])
    ['value']
"""

from collections import OrderedDict

from .py3 import iteritems


# This is an unused class. The intention of creating it should be to maintain DefaultDict characteristics when adding to OrderedDict
# This class is not found anywhere in backtrader, everyone can ignore it, it can even be deleted without affecting usage.
[文档] class OrderedDefaultdict(OrderedDict): """OrderedDict that creates default values for missing keys. Combines the insertion ordering of OrderedDict with the automatic default value creation of defaultdict. Attributes: default_factory: Callable that creates default values for missing keys. Example: >>> d = OrderedDefaultdict(list) >>> d['items'].append(1) >>> print(d['items']) [1] """ # Class initialization, passing *args parameters and **kwargs parameters
[文档] def __init__(self, *args, **kwargs): """Initialize the OrderedDefaultdict. Args: *args: If provided, first argument must be a callable that creates default values for missing keys (like list, dict, int). Remaining args are passed to OrderedDict. **kwargs: Keyword arguments passed to OrderedDict. Raises: TypeError: If first argument is not None or callable. """ # If no *args passed, default self.default_factory is None if not args: self.default_factory = None # If *args passed, if args[0] doesn't satisfy being None or callable, will raise error, if satisfied, default will be args[0], remaining parameters will be args[1:] else: if not (args[0] is None or callable(args[0])): raise TypeError("first argument must be callable or None") self.default_factory = args[0] args = args[1:] super().__init__(*args, **kwargs)
# When key value doesn't exist, if self.default_factory is None, will return key error; if not None, will return self.default_factory() def __missing__(self, key): if self.default_factory is None: raise KeyError(key) self[key] = default = self.default_factory() return default # Optional method, for supporting pickle def __reduce__(self): # optional, for pickle support args = (self.default_factory,) if self.default_factory else () return self.__class__, args, None, None, iteritems(self)