MergeStrategy

class astropy.utils.metadata.MergeStrategy[source]

Bases: object

Base class for defining a strategy for merging metadata from two sources, left and right, into a single output.

The primary functionality for the class is the merge(cls, left, right) class method. This takes left and right side arguments and returns a single merged output.

The first class attribute is types. This is defined as a list of (left_types, right_types) tuples that indicate for which input types the merge strategy applies. In determining whether to apply this merge strategy to a pair of (left, right) objects, a test is done: isinstance(left, left_types) and isinstance(right, right_types). For example:

types = [(np.ndarray, np.ndarray),  # Two ndarrays
         (np.ndarray, (list, tuple)),  # ndarray and (list or tuple)
         ((list, tuple), np.ndarray)]  # (list or tuple) and ndarray

As a convenience, types can be defined as a single two-tuple instead of a list of two-tuples, e.g. types = (np.ndarray, np.ndarray).

The other class attribute is enabled, which defaults to False in the base class. By defining a subclass of MergeStrategy the new merge strategy is automatically registered to be available for use in merging. However, by default the new merge strategy is not enabled. This prevents inadvertently changing the behavior of unrelated code that is performing metadata merge operations.

In most cases (particularly in library code that others might use) it is recommended to leave custom strategies disabled and use the enable_merge_strategies context manager to locally enable the desired strategies. However, if one is confident that the new strategy will not produce unexpected behavior, then one can globally enable it by setting the enabled class attribute to True.

Examples

Here we define a custom merge strategy that takes an int or float on the left and right sides and returns a list with the two values.

>>> from astropy.utils.metadata import MergeStrategy
>>> class MergeNumbersAsList(MergeStrategy):
...     types = ((int, float), (int, float))  # (left_types, right_types)
...
...     @classmethod
...     def merge(cls, left, right):
...         return [left, right]

Attributes Summary

enabled

Attributes Documentation

enabled = False