decorators
Module which defines decorators
- MDMC.common.decorators.mod_docstring(replacements: dict[str, str]) Callable[source]
Decorator for modifying the docstring of a function, method, class or property
This is done by replacing specified substrings. After replacement the docstring is text wrapped to ensure that line length and indentations are preserved.
While this can be used for replacements in equations, care must be taken to ensure that wrapping does not cause line breaks in invalid places in the Latex.
- Parameters:
replacements (dict) – {old:new} pairs where old is a str in the docstring which will be replaced, and new is the str it should be replaced with.
- Returns:
A decorator which modifies the docstring of a function, method, class or property
- Return type:
function
- Raises:
TypeError – If
mod_docstringis applied to an object which is not a function, method, class, or property
Examples
To dynamically modify the docstring of a function so “this” is replaced with “that”:
@mod_docstring({'this':'that'}) def function(): """ The word this will be replaced """
To dynamically modify the docstring of a class so “this” is replaced with “that”:
@mod_docstring({'this':'that'}) class DocClass(): """ This is the class level docstring. The word this will be replaced. """
To dynamically modify the docstring of a property so “this” is replaced with “that”:
@property @mod_docstring({'this':'that'}) def prop(): """ The word this will be replaced. """
- MDMC.common.decorators.repr_decorator(attribute: str, *attributes: str | None)[source]
Implements
__repr__for a class using passed attributes (including properties)The first element of all
__repr__returns is always the name of the classWarning
Testing for
repr_decoratoris restricted to testing the decorator outputs the correct format, not whether each occurence it is used is valid. It is strongly recommended that classes decorated withrepr_decoratorare tested to ensure thatrepr(class)is valid, for instance whether the class actually has all of the attributes passed as str torepr_decorator.- Parameters:
attribute (str) – The name of an attribute of the class being decorated. This attribute (or property) will be included in the
__repr__of the class.*attributes (str) – Zero or more str with the name of an attribute (or property) of the class being decorated. These attributes will be included in the
__repr__of the class.
- Returns:
A class with
__repr__implemented such thatattributeandattributesare printed- Return type:
class
Example
Add a
repr_decoratorto theAtomclass to include thenameattribute and thepositionproperty:>>> @repr_decorator('name', 'position') ... Class Atom(Structure): ... ... def __init__(self, element, name, position): ... self.element = element ... self.name = name ... self.position = position ... ... @property ... def position(self): ... return self._position ... ... atom = Atom('H', 'Hydrogen', [1., 1., 1.]) ... atom < Atom {name: 'Hydrogen', position: [1., 1., 1.]}>
- MDMC.common.decorators.set_docstring(docstring: str) Callable[source]
Decorator for setting the docstring of a function, method, class or property
The new docstring is text wrapped to ensure that the line length is valid. It is assumed that the specified docstring has the correct indentations.
- Parameters:
docstring (str) – The new docstring for the function, method, class or property
- Returns:
A decorator which sets the docstring of a function, method, class or property
- Return type:
function
- Raises:
TypeError – If
set_docstringis applied to an object which is not a function, method, class, or property
Examples
To dynamically set the docstring of a function:
@set_docstring("This is the new docstring") def function(): """ This docstring will be replaced """
To dynamically set the docstring of a class:
@set_docstring("This is the new docstring") class DocClass(): """ This is a class level docstring. This docstring will be replaced. """
To dynamically set the docstring of a property:
@property @set_docstring("This is the new docstring") def prop(): """ This docstring will be replaced """
- MDMC.common.decorators.time_function_execution(func) Callable[source]
Creates an instance of the TimeKeeper and stores the function execution time in TimeKeeper’s class attributes.
This decorator is meant to be used on functions that are likely to be using up too much CPU time, so the scale of the problem can be assessed.
- MDMC.common.decorators.unit_decorator(unit: str | None) Callable[source]
Decorates
property.settermethods to add unitsAdds units to the values passed to
property.settermethods. These units are displayed when eitherreprorstris called for the correspondingproperty.gettermethod.Suitable for use with setter methods that either take float (or objects that can be cast to float), or NumPy array (or objects that can be cast to NumPy array).
- Parameters:
unit (str or None) – The
unitapplied to the property. If None thenself.unitis used, which enables classes to have properties with units defined at runtime.- Returns:
A
property.setterfunction with avalueparameter which has aunit.- Return type:
function
Example
Add a
unit_decoratorto thepositionproperty:>>> Class Atom(Structure): ... ... @property ... def position(self): ... return self._position ... ... @position.setter ... @unit_decorator(unit=Unit('Ang')) ... def position(self, value): ... self._position = value
- MDMC.common.decorators.unit_decorator_getter(unit: str | None) Callable[source]
Decorates
property.gettermethods to add unitsAdds units to the return values of
property.gettermethods. These units are displayed when eitherreprorstris called.Suitable for use with setter methods that either take float (or objects that can be cast to float), or NumPy array (or objects that can be cast to NumPy array). This method exists for properties which have no setter method.
- Parameters:
unit (str or None) – The
unitapplied to the property. If None thenself.unitis used, which enables classes to have properties with units defined at runtime.- Returns:
A
property.getterfunction with a return type which has a unit (e.g.UnitFloatorUnitArray)- Return type:
function
Example
Add a
unit_decorator_getterto thevolumeproperty:>>> Class Universe: ... ... @property ... @unit_decorator_getter(unit=Unit('Ang') ^ 3) ... def volume(self): ... return self.dimensions ** 3
- MDMC.common.decorators.weakref_cache(maxsize=128) Callable[source]
Weakref LRU cache to avoid memory leaks
Caches on instance methods store self, which can lead to excess memory use. This avoids it by only holding a weakref to the instance.
- MDMC.common.decorators.wrap_docstring(docstring: str, line_length: int) str[source]
Wraps a docstring to a specific line length.
This maintains any indentation which exists at the start of a line. While equations should not be affected by this wrapping, it is recommended that docstrings with .. math:: are visually checked after wrapping.
- Parameters:
- Returns:
The wrapped docstring
- Return type:
- Raises:
ValueError – If any indent has more characters than the
line_length, as the wrapping cannot then preserve the correct indent