Patch

class pyhf.patchset.Patch(spec)[source]

Bases: jsonpatch.JsonPatch

A way to store a patch definition as part of a patchset (PatchSet).

It contains metadata about the Patch itself:

  • a descriptive name

  • a list of the values for each dimension in the phase-space the associated PatchSet is defined for, see labels

In addition to the above metadata, the Patch object behaves like the underlying jsonpatch.JsonPatch.

Attributes

metadata

The metadata of the patch

name

The name of the patch

operations = mappingproxy({'remove': <class 'jsonpatch.RemoveOperation'>, 'add': <class 'jsonpatch.AddOperation'>, 'replace': <class 'jsonpatch.ReplaceOperation'>, 'move': <class 'jsonpatch.MoveOperation'>, 'test': <class 'jsonpatch.TestOperation'>, 'copy': <class 'jsonpatch.CopyOperation'>})

A JSON Patch is a list of Patch Operations.

>>> patch = JsonPatch([
...     {'op': 'add', 'path': '/foo', 'value': 'bar'},
...     {'op': 'add', 'path': '/baz', 'value': [1, 2, 3]},
...     {'op': 'remove', 'path': '/baz/1'},
...     {'op': 'test', 'path': '/baz', 'value': [1, 3]},
...     {'op': 'replace', 'path': '/baz/0', 'value': 42},
...     {'op': 'remove', 'path': '/baz/1'},
... ])
>>> doc = {}
>>> result = patch.apply(doc)
>>> expected = {'foo': 'bar', 'baz': [42]}
>>> result == expected
True

JsonPatch object is iterable, so you can easily access each patch statement in a loop:

>>> lpatch = list(patch)
>>> expected = {'op': 'add', 'path': '/foo', 'value': 'bar'}
>>> lpatch[0] == expected
True
>>> lpatch == patch.patch
True

Also JsonPatch could be converted directly to bool if it contains any operation statements:

>>> bool(patch)
True
>>> bool(JsonPatch([]))
False

This behavior is very handy with make_patch() to write more readable code:

>>> old = {'foo': 'bar', 'numbers': [1, 3, 4, 8]}
>>> new = {'baz': 'qux', 'numbers': [1, 4, 7]}
>>> patch = make_patch(old, new)
>>> if patch:
...     # document have changed, do something useful
...     patch.apply(old)    
{...}
values

The values of the associated labels for the patch

Methods

__init__(spec)[source]

Construct a Patch.

Parameters

spec (jsonable) – The patch JSON specification

Returns

The Patch instance.

Return type

patch (Patch)