diff --git a/Changelog.rst b/Changelog.rst index b18f7dd25a..9746ca2f0e 100644 --- a/Changelog.rst +++ b/Changelog.rst @@ -1,3 +1,15 @@ +Version 1.10.0.3 +---------------- + +**2023-??-??** + +* New method: `cfdm.Field.del_properties` + (https://github.com/NCAS-CMS/cfdm/issues/241) +* New keyword parameter to `cfdm.unique_constructs`: + ``ignore_properties`` (https://github.com/NCAS-CMS/cfdm/issues/240) + +---- + Version 1.10.0.2 ---------------- diff --git a/cfdm/cellmeasure.py b/cfdm/cellmeasure.py index 8e0abe806f..0e8286e942 100644 --- a/cfdm/cellmeasure.py +++ b/cfdm/cellmeasure.py @@ -224,7 +224,7 @@ def equals( verbose=None, ignore_data_type=False, ignore_fill_value=False, - ignore_properties=(), + ignore_properties=None, ignore_compression=True, ignore_type=False, ): @@ -232,24 +232,25 @@ def equals( Equality is strict by default. This means that: - * the same descriptive properties must be present, with the same - values and data types, and vector-valued properties must also have - same the size and be element-wise equal (see the *ignore_properties* - and *ignore_data_type* parameters), and + * the same descriptive properties must be present, with the + same values and data types, and vector-valued properties + must also have same the size and be element-wise equal (see + the *ignore_properties* and *ignore_data_type* parameters), + and .. - * if there are data arrays then they must have same shape and data - type, the same missing data mask, and be element-wise equal (see the - *ignore_data_type* parameter). + * if there are data arrays then they must have same shape and + data type, the same missing data mask, and be element-wise + equal (see the *ignore_data_type* parameter). {{equals tolerance}} {{equals compression}} - Any type of object may be tested but, in general, equality is only - possible with another cell measure construct, or a subclass of - one. See the *ignore_type* parameter. + Any type of object may be tested but, in general, equality is + only possible with another cell measure construct, or a + subclass of one. See the *ignore_type* parameter. {{equals netCDF}} @@ -268,8 +269,7 @@ def equals( {{verbose: `int` or `str` or `None`, optional}} - ignore_properties: sequence of `str`, optional - The names of properties to omit from the comparison. + {{ignore_properties: (sequence of `str`), optional}} {{ignore_data_type: `bool`, optional}} diff --git a/cfdm/core/abstract/properties.py b/cfdm/core/abstract/properties.py index 125bc97697..b05e8b88c1 100644 --- a/cfdm/core/abstract/properties.py +++ b/cfdm/core/abstract/properties.py @@ -45,7 +45,8 @@ def clear_properties(self): .. versionadded:: (cfdm) 1.7.0 - .. seealso:: `del_property` `properties`, `set_properties` + .. seealso:: `del_properties`, `del_property`, `properties`, + `set_properties` :Returns: @@ -134,6 +135,61 @@ def del_property(self, prop, default=ValueError()): f"{self.__class__.__name__!r} has no {prop!r} property", ) + def del_properties(self, properties): + """Remove properties. + + .. versionadded:: (cfdm) 1.10.0.3 + + .. seealso:: `clear_properties`, `del_property`, `properties`, + `set_properties` + + :Parameters: + + properties: (sequence of) `str` + The names of the properties to be removed. If the + `{{class}}` does not have a particular property then + that property is ignored. No properties are removed if + *properties* is an empty sequence. + + *Parameter example:* + ``'long_name'`` + + *Parameter example:* + ``['long_name', 'comment']`` + + :Returns: + + `dict` + The removed property values, keyed by property name. + + **Examples** + + >>> f = {{package}}.{{class}}() + >>> f.set_properties({'project': 'CMIP7', 'comment': 'model'}) + >>> removed_properties = f.del_properties('project') + >>> removed_properties + {'project': 'CMIP7'} + >>> f.properties() + {'comment': 'model'} + >>> f.set_properties(removed_properties) + >>> f.properties() + {'comment': 'model', 'project': 'CMIP7'} + >>> f.del_properties('foo') + {} + + """ + if isinstance(properties, str): + properties = (properties,) + + out = {} + for prop in properties: + try: + out[prop] = self.del_property(prop) + except ValueError: + pass + + return out + def get_property(self, prop, default=ValueError()): """Return a property. diff --git a/cfdm/docstring/docstring.py b/cfdm/docstring/docstring.py index 35f2ac0adb..e30afa6673 100644 --- a/cfdm/docstring/docstring.py +++ b/cfdm/docstring/docstring.py @@ -140,7 +140,7 @@ If True then all ``_FillValue`` and ``missing_value`` properties are omitted from the comparison.""", # ignore_properties - "{{ignore_properties: sequence of `str`, optional}}": """ignore_properties: sequence of `str`, optional + "{{ignore_properties: (sequence of) `str`, optional}}": """ignore_properties: (sequence of) `str`, optional The names of properties to omit from the comparison.""", # inplace diff --git a/cfdm/functions.py b/cfdm/functions.py index 836ab4bc89..886d6f13ae 100644 --- a/cfdm/functions.py +++ b/cfdm/functions.py @@ -432,7 +432,7 @@ def abspath(filename): return os.path.abspath(filename) -def unique_constructs(constructs, copy=True): +def unique_constructs(constructs, ignore_properties=None, copy=True): """Return the unique constructs from a sequence. .. versionadded:: (cfdm) 1.9.0.0 @@ -443,14 +443,29 @@ def unique_constructs(constructs, copy=True): The constructs to be compared. The constructs may comprise a mixture of types. The sequence can be empty. + ignore_properties: (sequence of) `str`, optional + The names of construct properties to be ignored when + testing for uniqueness. Any of these properties which have + unequal values on otherwise equal input constructs are + removed from the returned unique construct. + + .. versionadded:: (cfdm) 1.10.0.3 + copy: `bool`, optional - If True (the default) then deep copy returned constructs, - else they are not (deep) copied. + If True (the default) then each returned construct is a + deep copy of an input construct, otherwise they are not + copies. + + If *ignore_properties* has been set then *copy* is ignored + and deep copies are always returned, even if + *ignore_properties* is an empty sequence. :Returns: - `list` - The unique constructs. May be an empty list. + Sequence of constructs + The unique constructs in a sequence of the same type as + the input *constructs*. If *constructs* was a generator + then a generator is returned. **Examples** @@ -482,53 +497,75 @@ def unique_constructs(constructs, copy=True): ] """ + out_type = type(constructs) + if not constructs: - # constructs is an empty sequence - return [] + # 'constructs' is an empty sequence + return out_type([]) # ---------------------------------------------------------------- # Find the first construct in the sequence and create an iterator # for the rest # ---------------------------------------------------------------- try: - # constructs is a sequence? + # 'constructs' is a sequence? construct0 = constructs[0] constructs = (c for c in constructs[1:]) except TypeError: try: - # constructs is a generator? + # 'constructs' is a generator? construct0 = next(constructs) except StopIteration: - # constructs is an empty generator - return [] - # --- End: try + # 'constructs' is an empty generator + return (c for c in ()) + else: + generator_out = True + else: + generator_out = False + + if ignore_properties is not None: + copy = True + + if isinstance(ignore_properties, str): + ignore_properties = (ignore_properties,) if copy: construct0 = construct0.copy() - # Initialise the output list + # Initialise the list of unique constructs out = [construct0] # ---------------------------------------------------------------- - # Loop round the iterator, adding any "new" constructs to the - # output list + # Loop round the iterator, adding any new unique constructs to the + # list # ---------------------------------------------------------------- for construct in constructs: - is_equal = False + equal = False + for c in out: - if construct.equals(c, verbose="DISABLE"): - is_equal = True + if construct.equals( + c, ignore_properties=ignore_properties, verbose="DISABLE" + ): + equal = True + if ignore_properties: + for prop in ignore_properties: + if construct.get_property( + prop, None + ) != c.get_property(prop, None): + c.del_property(prop, None) + break - # --- End: for - if not is_equal: + if not equal: if copy: construct = construct.copy() out.append(construct) - # --- End: for - return out + if generator_out: + return (c for c in out) + + return out_type(out) @total_ordering diff --git a/cfdm/mixin/fielddomain.py b/cfdm/mixin/fielddomain.py index 9599e0b60a..45728f4b08 100644 --- a/cfdm/mixin/fielddomain.py +++ b/cfdm/mixin/fielddomain.py @@ -1768,7 +1768,7 @@ def equals( verbose=None, ignore_data_type=False, ignore_fill_value=False, - ignore_properties=(), + ignore_properties=None, ignore_compression=True, ignore_type=False, ): @@ -1813,7 +1813,7 @@ def equals( {{ignore_fill_value: `bool`, optional}} - ignore_properties: sequence of `str`, optional + ignore_properties: (sequence of) `str`, optional The names of properties of the construct (not the metadata constructs) to omit from the comparison. Note that the ``Conventions`` property is always omitted. @@ -1853,7 +1853,12 @@ def equals( """ # Check the properties and data - ignore_properties = tuple(ignore_properties) + ("Conventions",) + if not ignore_properties: + ignore_properties = ("Conventions",) + elif isinstance(ignore_properties, str): + ignore_properties = (ignore_properties, "Conventions") + else: + ignore_properties = tuple(ignore_properties) + ("Conventions",) if not super().equals( other, diff --git a/cfdm/mixin/properties.py b/cfdm/mixin/properties.py index 08d1e5746d..36e4581aa4 100644 --- a/cfdm/mixin/properties.py +++ b/cfdm/mixin/properties.py @@ -240,7 +240,7 @@ def equals( verbose=None, ignore_data_type=False, ignore_fill_value=False, - ignore_properties=(), + ignore_properties=None, ignore_type=False, ignore_compression=True, ): @@ -276,7 +276,7 @@ def equals( {{verbose: `int` or `str` or `None`, optional}} - {{ignore_properties: sequence of `str`, optional}} + {{ignore_properties: (sequence of `str`), optional}} {{ignore_data_type: `bool`, optional}} @@ -327,6 +327,9 @@ def equals( other_properties = other.properties() if ignore_properties: + if isinstance(ignore_properties, str): + ignore_properties = (ignore_properties,) + for prop in ignore_properties: self_properties.pop(prop, None) other_properties.pop(prop, None) diff --git a/cfdm/mixin/propertiesdata.py b/cfdm/mixin/propertiesdata.py index 391cb12e9d..9e4bbba47b 100644 --- a/cfdm/mixin/propertiesdata.py +++ b/cfdm/mixin/propertiesdata.py @@ -678,7 +678,7 @@ def equals( verbose=None, ignore_data_type=False, ignore_fill_value=False, - ignore_properties=(), + ignore_properties=None, ignore_compression=True, ignore_type=False, ): @@ -723,7 +723,7 @@ def equals( {{verbose: `int` or `str` or `None`, optional}} - {{ignore_properties: sequence of `str`, optional}} + {{ignore_properties: (sequence of) `str`, optional}} {{ignore_data_type: `bool`, optional}} diff --git a/cfdm/mixin/propertiesdatabounds.py b/cfdm/mixin/propertiesdatabounds.py index 9fffde0f03..e1de43623d 100644 --- a/cfdm/mixin/propertiesdatabounds.py +++ b/cfdm/mixin/propertiesdatabounds.py @@ -900,7 +900,7 @@ def equals( verbose=None, ignore_data_type=False, ignore_fill_value=False, - ignore_properties=(), + ignore_properties=None, ignore_compression=True, ignore_type=False, ): @@ -950,7 +950,7 @@ def equals( {{verbose: `int` or `str` or `None`, optional}} - {{ignore_properties: sequence of `str`, optional}} + {{ignore_properties: (sequence of) `str`, optional}} {{ignore_data_type: `bool`, optional}} diff --git a/cfdm/test/test_Field.py b/cfdm/test/test_Field.py index dff95f5f81..ce09beeee0 100644 --- a/cfdm/test/test_Field.py +++ b/cfdm/test/test_Field.py @@ -855,6 +855,24 @@ def test_Field_get_original_filenames(self): f.get_original_filenames(), f.copy().get_original_filenames() ) + def test_Field_del_properties(self): + """Test the del_properties method of Field.""" + f = cfdm.Field() + f.set_properties({"project": "CMIP7", "comment": "model"}) + properties = f.properties() + + removed_properties = f.del_properties("project") + self.assertEqual(removed_properties, {"project": "CMIP7"}) + self.assertEqual(f.properties(), {"comment": "model"}) + f.set_properties(removed_properties) + self.assertEqual(f.properties(), properties) + self.assertEqual(f.del_properties("foo"), {}) + self.assertEqual(f.properties(), properties) + + removed_properties = f.del_properties(["project", "comment"]) + self.assertEqual(removed_properties, properties) + self.assertEqual(f.properties(), {}) + if __name__ == "__main__": print("Run date:", datetime.datetime.now()) diff --git a/cfdm/test/test_core_1.py b/cfdm/test/test_core_1.py index e56ce37ba7..f30fb4fe64 100644 --- a/cfdm/test/test_core_1.py +++ b/cfdm/test/test_core_1.py @@ -258,9 +258,6 @@ def test_core_FUNCTIONS(self): self.assertIsInstance(cfdm.core.environment(display=False), list) -# --- End: class - - if __name__ == "__main__": print("Run date:", datetime.datetime.now()) cfdm.environment() diff --git a/cfdm/test/test_functions.py b/cfdm/test/test_functions.py index d46a974612..891de97ca8 100644 --- a/cfdm/test/test_functions.py +++ b/cfdm/test/test_functions.py @@ -383,7 +383,16 @@ def test_unique_constructs(self): fields = [f, f, g] domains = [x.domain for x in (f, f, g)] - self.assertEqual(len(cfdm.unique_constructs(domains)), 2) + u = cfdm.unique_constructs(domains) + self.assertEqual(len(u), 2) + self.assertIsNot(u[0], domains[0]) + + u = cfdm.unique_constructs(domains, copy=False) + self.assertIs(u[0], domains[0]) + + u = cfdm.unique_constructs(domains, ignore_properties="z", copy=False) + self.assertIsNot(u[0], domains[0]) + self.assertEqual(len(cfdm.unique_constructs(domains + fields)), 4) self.assertEqual( len(cfdm.unique_constructs(domains + fields + [f.domain])), 4 @@ -391,13 +400,39 @@ def test_unique_constructs(self): # Test generator domains = (x.domain for x in ()) - self.assertEqual(len(cfdm.unique_constructs(domains)), 0) + u = cfdm.unique_constructs(domains) + self.assertIsInstance(u, type(domains)) + self.assertEqual(len(tuple(u)), 0) domains = (x.domain for x in (f,)) - self.assertEqual(len(cfdm.unique_constructs(domains)), 1) + u = cfdm.unique_constructs(domains) + self.assertIsInstance(u, type(domains)) + self.assertEqual(len(tuple(u)), 1) domains = (x.domain for x in (f, f, g)) - self.assertEqual(len(cfdm.unique_constructs(domains)), 2) + u = cfdm.unique_constructs(domains) + self.assertIsInstance(u, type(domains)) + self.assertEqual(len(tuple(u)), 2) + + self.assertIsInstance(cfdm.unique_constructs(fields), type(fields)) + self.assertIsInstance(cfdm.unique_constructs(tuple(fields)), tuple) + + f.set_properties({"project": "model", "foo": "bar"}) + f.set_property("project", "model") + f2 = f.copy() + f2.set_property("project", "obs") + g.set_properties({"project": "model", "foo": "bar"}) + fields = [f, f2, g] + + self.assertEqual(len(cfdm.unique_constructs(fields)), 3) + u = cfdm.unique_constructs( + fields, ignore_properties=["project", "foo"] + ) + self.assertEqual(len(u), 2) + self.assertIsNone(u[0].get_property("project", None)) + self.assertEqual(u[0].get_property("foo"), "bar") + self.assertEqual(u[1].get_property("project"), "model") + self.assertEqual(u[1].get_property("foo"), "bar") def test_context_managers(self): """Test the context manager support of the functions.""" diff --git a/docs/source/class/cfdm.AuxiliaryCoordinate.rst b/docs/source/class/cfdm.AuxiliaryCoordinate.rst index 51103cc89d..f7e8d6ce5d 100644 --- a/docs/source/class/cfdm.AuxiliaryCoordinate.rst +++ b/docs/source/class/cfdm.AuxiliaryCoordinate.rst @@ -51,6 +51,7 @@ Properties ~cfdm.AuxiliaryCoordinate.set_property ~cfdm.AuxiliaryCoordinate.properties ~cfdm.AuxiliaryCoordinate.clear_properties + ~cfdm.AuxiliaryCoordinate.del_properties ~cfdm.AuxiliaryCoordinate.set_properties Data diff --git a/docs/source/class/cfdm.Bounds.rst b/docs/source/class/cfdm.Bounds.rst index 3587bd69b9..e85e38f9c6 100644 --- a/docs/source/class/cfdm.Bounds.rst +++ b/docs/source/class/cfdm.Bounds.rst @@ -40,6 +40,7 @@ Properties ~cfdm.Bounds.set_property ~cfdm.Bounds.properties ~cfdm.Bounds.clear_properties + ~cfdm.Bounds.del_properties ~cfdm.Bounds.set_properties ~cfdm.Bounds.inherited_properties diff --git a/docs/source/class/cfdm.CellMeasure.rst b/docs/source/class/cfdm.CellMeasure.rst index 30134979a9..44b89e7b4a 100644 --- a/docs/source/class/cfdm.CellMeasure.rst +++ b/docs/source/class/cfdm.CellMeasure.rst @@ -56,6 +56,7 @@ Properties ~cfdm.CellMeasure.set_property ~cfdm.CellMeasure.properties ~cfdm.CellMeasure.clear_properties + ~cfdm.CellMeasure.del_properties ~cfdm.CellMeasure.set_properties Data diff --git a/docs/source/class/cfdm.Count.rst b/docs/source/class/cfdm.Count.rst index 53e44cc076..dfd8723b47 100644 --- a/docs/source/class/cfdm.Count.rst +++ b/docs/source/class/cfdm.Count.rst @@ -40,6 +40,7 @@ Properties ~cfdm.Count.set_property ~cfdm.Count.properties ~cfdm.Count.clear_properties + ~cfdm.Count.del_properties ~cfdm.Count.set_properties Data diff --git a/docs/source/class/cfdm.DimensionCoordinate.rst b/docs/source/class/cfdm.DimensionCoordinate.rst index c2decba817..5b9f412fe0 100644 --- a/docs/source/class/cfdm.DimensionCoordinate.rst +++ b/docs/source/class/cfdm.DimensionCoordinate.rst @@ -51,6 +51,7 @@ Properties ~cfdm.DimensionCoordinate.set_property ~cfdm.DimensionCoordinate.properties ~cfdm.DimensionCoordinate.clear_properties + ~cfdm.DimensionCoordinate.del_properties ~cfdm.DimensionCoordinate.set_properties Data diff --git a/docs/source/class/cfdm.Domain.rst b/docs/source/class/cfdm.Domain.rst index 8811bdc789..572cac3f67 100644 --- a/docs/source/class/cfdm.Domain.rst +++ b/docs/source/class/cfdm.Domain.rst @@ -100,6 +100,7 @@ Properties ~cfdm.Domain.set_property ~cfdm.Domain.properties ~cfdm.Domain.clear_properties + ~cfdm.Domain.del_properties ~cfdm.Domain.set_properties Miscellaneous diff --git a/docs/source/class/cfdm.DomainAncillary.rst b/docs/source/class/cfdm.DomainAncillary.rst index 87ace4928d..879cd3c486 100644 --- a/docs/source/class/cfdm.DomainAncillary.rst +++ b/docs/source/class/cfdm.DomainAncillary.rst @@ -51,6 +51,7 @@ Properties ~cfdm.DomainAncillary.set_property ~cfdm.DomainAncillary.properties ~cfdm.DomainAncillary.clear_properties + ~cfdm.DomainAncillary.del_properties ~cfdm.DomainAncillary.set_properties Data diff --git a/docs/source/class/cfdm.Field.rst b/docs/source/class/cfdm.Field.rst index 450ce2dcc9..4f0352ff03 100644 --- a/docs/source/class/cfdm.Field.rst +++ b/docs/source/class/cfdm.Field.rst @@ -55,6 +55,7 @@ Properties ~cfdm.Field.set_property ~cfdm.Field.properties ~cfdm.Field.clear_properties + ~cfdm.Field.del_properties ~cfdm.Field.set_properties .. _Field-Data: diff --git a/docs/source/class/cfdm.FieldAncillary.rst b/docs/source/class/cfdm.FieldAncillary.rst index f450aabe07..ec394525db 100644 --- a/docs/source/class/cfdm.FieldAncillary.rst +++ b/docs/source/class/cfdm.FieldAncillary.rst @@ -51,6 +51,7 @@ Properties ~cfdm.FieldAncillary.set_property ~cfdm.FieldAncillary.properties ~cfdm.FieldAncillary.clear_properties + ~cfdm.FieldAncillary.del_properties ~cfdm.FieldAncillary.set_properties Data diff --git a/docs/source/class/cfdm.Index.rst b/docs/source/class/cfdm.Index.rst index 91c6a8566b..b65c0ec8a9 100644 --- a/docs/source/class/cfdm.Index.rst +++ b/docs/source/class/cfdm.Index.rst @@ -40,6 +40,7 @@ Properties ~cfdm.Index.set_property ~cfdm.Index.properties ~cfdm.Index.clear_properties + ~cfdm.Index.del_properties ~cfdm.Index.set_properties Data diff --git a/docs/source/class/cfdm.InteriorRing.rst b/docs/source/class/cfdm.InteriorRing.rst index c9b0a111c1..31d3e67dae 100644 --- a/docs/source/class/cfdm.InteriorRing.rst +++ b/docs/source/class/cfdm.InteriorRing.rst @@ -40,6 +40,7 @@ Properties ~cfdm.InteriorRing.set_property ~cfdm.InteriorRing.properties ~cfdm.InteriorRing.clear_properties + ~cfdm.InteriorRing.del_properties ~cfdm.InteriorRing.set_properties Data diff --git a/docs/source/class/cfdm.List.rst b/docs/source/class/cfdm.List.rst index 1ef0b925a2..ca6d2dcda6 100644 --- a/docs/source/class/cfdm.List.rst +++ b/docs/source/class/cfdm.List.rst @@ -40,6 +40,7 @@ Properties ~cfdm.List.set_property ~cfdm.List.properties ~cfdm.List.clear_properties + ~cfdm.List.del_properties ~cfdm.List.set_properties Data diff --git a/docs/source/class/cfdm.core.AuxiliaryCoordinate.rst b/docs/source/class/cfdm.core.AuxiliaryCoordinate.rst index e1c50e8a39..c29e6362de 100644 --- a/docs/source/class/cfdm.core.AuxiliaryCoordinate.rst +++ b/docs/source/class/cfdm.core.AuxiliaryCoordinate.rst @@ -38,6 +38,7 @@ Properties ~cfdm.core.AuxiliaryCoordinate.set_property ~cfdm.core.AuxiliaryCoordinate.properties ~cfdm.core.AuxiliaryCoordinate.clear_properties + ~cfdm.core.AuxiliaryCoordinate.del_properties ~cfdm.core.AuxiliaryCoordinate.set_properties Data diff --git a/docs/source/class/cfdm.core.Bounds.rst b/docs/source/class/cfdm.core.Bounds.rst index 4c472e3c26..f34372f4a8 100644 --- a/docs/source/class/cfdm.core.Bounds.rst +++ b/docs/source/class/cfdm.core.Bounds.rst @@ -26,6 +26,7 @@ Properties ~cfdm.core.Bounds.set_property ~cfdm.core.Bounds.properties ~cfdm.core.Bounds.clear_properties + ~cfdm.core.Bounds.del_properties ~cfdm.core.Bounds.set_properties Data diff --git a/docs/source/class/cfdm.core.CellMeasure.rst b/docs/source/class/cfdm.core.CellMeasure.rst index 80fd8f904d..c4fc2896b2 100644 --- a/docs/source/class/cfdm.core.CellMeasure.rst +++ b/docs/source/class/cfdm.core.CellMeasure.rst @@ -42,6 +42,7 @@ Properties ~cfdm.core.CellMeasure.set_property ~cfdm.core.CellMeasure.properties ~cfdm.core.CellMeasure.clear_properties + ~cfdm.core.CellMeasure.del_properties ~cfdm.core.CellMeasure.set_properties Data diff --git a/docs/source/class/cfdm.core.Coordinate.rst b/docs/source/class/cfdm.core.Coordinate.rst index cec969fda1..99bf59094b 100644 --- a/docs/source/class/cfdm.core.Coordinate.rst +++ b/docs/source/class/cfdm.core.Coordinate.rst @@ -26,6 +26,7 @@ Properties ~cfdm.core.Coordinate.set_property ~cfdm.core.Coordinate.properties ~cfdm.core.Coordinate.clear_properties + ~cfdm.core.Coordinate.del_properties ~cfdm.core.Coordinate.set_properties Data diff --git a/docs/source/class/cfdm.core.DimensionCoordinate.rst b/docs/source/class/cfdm.core.DimensionCoordinate.rst index 0953d94f9e..206904d779 100644 --- a/docs/source/class/cfdm.core.DimensionCoordinate.rst +++ b/docs/source/class/cfdm.core.DimensionCoordinate.rst @@ -38,6 +38,7 @@ Properties ~cfdm.core.DimensionCoordinate.set_property ~cfdm.core.DimensionCoordinate.properties ~cfdm.core.DimensionCoordinate.clear_properties + ~cfdm.core.DimensionCoordinate.del_properties ~cfdm.core.DimensionCoordinate.set_properties Data diff --git a/docs/source/class/cfdm.core.Domain.rst b/docs/source/class/cfdm.core.Domain.rst index 8d1e7b3316..a30ddc4279 100644 --- a/docs/source/class/cfdm.core.Domain.rst +++ b/docs/source/class/cfdm.core.Domain.rst @@ -66,6 +66,7 @@ Properties ~cfdm.core.Domain.set_property ~cfdm.core.Domain.properties ~cfdm.core.Domain.clear_properties + ~cfdm.core.Domain.del_properties ~cfdm.core.Domain.set_properties Miscellaneous diff --git a/docs/source/class/cfdm.core.DomainAncillary.rst b/docs/source/class/cfdm.core.DomainAncillary.rst index 32e35e93e9..c14a307d87 100644 --- a/docs/source/class/cfdm.core.DomainAncillary.rst +++ b/docs/source/class/cfdm.core.DomainAncillary.rst @@ -38,6 +38,7 @@ Properties ~cfdm.core.DomainAncillary.set_property ~cfdm.core.DomainAncillary.properties ~cfdm.core.DomainAncillary.clear_properties + ~cfdm.core.DomainAncillary.del_properties ~cfdm.core.DomainAncillary.set_properties Data diff --git a/docs/source/class/cfdm.core.Field.rst b/docs/source/class/cfdm.core.Field.rst index f83fbdbef1..bde00c363a 100644 --- a/docs/source/class/cfdm.core.Field.rst +++ b/docs/source/class/cfdm.core.Field.rst @@ -42,6 +42,7 @@ Properties ~cfdm.core.Field.set_property ~cfdm.core.Field.properties ~cfdm.core.Field.clear_properties + ~cfdm.core.Field.del_properties ~cfdm.core.Field.set_properties .. _core-Field-Data: diff --git a/docs/source/class/cfdm.core.FieldAncillary.rst b/docs/source/class/cfdm.core.FieldAncillary.rst index cb4ff6fb0f..9a99cc1643 100644 --- a/docs/source/class/cfdm.core.FieldAncillary.rst +++ b/docs/source/class/cfdm.core.FieldAncillary.rst @@ -38,6 +38,7 @@ Properties ~cfdm.core.FieldAncillary.set_property ~cfdm.core.FieldAncillary.properties ~cfdm.core.FieldAncillary.clear_properties + ~cfdm.core.FieldAncillary.del_properties ~cfdm.core.FieldAncillary.set_properties Data diff --git a/docs/source/class/cfdm.core.InteriorRing.rst b/docs/source/class/cfdm.core.InteriorRing.rst index 81a0baf0f6..dd5b86ee2b 100644 --- a/docs/source/class/cfdm.core.InteriorRing.rst +++ b/docs/source/class/cfdm.core.InteriorRing.rst @@ -26,6 +26,7 @@ Properties ~cfdm.core.InteriorRing.set_property ~cfdm.core.InteriorRing.properties ~cfdm.core.InteriorRing.clear_properties + ~cfdm.core.InteriorRing.del_properties ~cfdm.core.InteriorRing.set_properties Data diff --git a/docs/source/class/cfdm.core.Properties.rst b/docs/source/class/cfdm.core.Properties.rst index 1dde37b67c..6e35e6b51e 100644 --- a/docs/source/class/cfdm.core.Properties.rst +++ b/docs/source/class/cfdm.core.Properties.rst @@ -26,6 +26,7 @@ Properties ~cfdm.core.Properties.set_property ~cfdm.core.Properties.properties ~cfdm.core.Properties.clear_properties + ~cfdm.core.Properties.del_properties ~cfdm.core.Properties.set_properties Miscellaneous diff --git a/docs/source/class/cfdm.core.PropertiesData.rst b/docs/source/class/cfdm.core.PropertiesData.rst index de777b68b9..be0931634b 100644 --- a/docs/source/class/cfdm.core.PropertiesData.rst +++ b/docs/source/class/cfdm.core.PropertiesData.rst @@ -27,6 +27,7 @@ Properties ~cfdm.core.PropertiesData.set_property ~cfdm.core.PropertiesData.properties ~cfdm.core.PropertiesData.clear_properties + ~cfdm.core.PropertiesData.del_properties ~cfdm.core.PropertiesData.set_properties Data diff --git a/docs/source/class/cfdm.core.PropertiesDataBounds.rst b/docs/source/class/cfdm.core.PropertiesDataBounds.rst index 71a3dbaf44..8616263f49 100644 --- a/docs/source/class/cfdm.core.PropertiesDataBounds.rst +++ b/docs/source/class/cfdm.core.PropertiesDataBounds.rst @@ -27,6 +27,7 @@ Properties ~cfdm.core.PropertiesDataBounds.set_property ~cfdm.core.PropertiesDataBounds.properties ~cfdm.core.PropertiesDataBounds.clear_properties + ~cfdm.core.PropertiesDataBounds.del_properties ~cfdm.core.PropertiesDataBounds.set_properties Data diff --git a/docs/source/tutorial.rst b/docs/source/tutorial.rst index 84fc1460c2..40beb7aca5 100644 --- a/docs/source/tutorial.rst +++ b/docs/source/tutorial.rst @@ -500,9 +500,9 @@ and `~Field.set_property` methods: 'air_temperature' A collection of properties may be set at the same time with the -`~Field.set_properties` method of the field construct, and all -properties may be completely removed with the -`~Field.clear_properties` method. +`~Field.set_properties` method of the field construct, and all or some +properties may be removed with the `~Field.clear_properties` and +`~Field.del_properties` methods respectively. .. code-block:: python :caption: *Update the properties with a collection, delete all of