unit

Framework for physical units.

The unit class provides a basic framework for specifying values with physical units using readable notation such as 2.5km/h. The system ensures that values are consistent with a measurement system derived from base units, but it does impose or even preload one such system. Instead, a derived class, created using either create(), should specify the units and scales relevant for the situation to which it is applied.

Once units are defined, the formal syntax for instantiating a quantity is:

<quantity> ::= <number> <units> | <number> <operator> <units>
<number>   ::= "" | <integer> | <integer> "." <integer>
            ; Numerical value, allowing for decimal fractions but not
            ; scientific notation. An empty number is equivalent to 1.
<units>    ::= <unit> | <unit> <operator> <units>
<unit>     ::= <prefix> <name> <power>
<prefix>   ::= "" | "h" | "k" | "M" | "G" | "T" | "P" | "E" | "Z" | "Y"
            | "d" | "c" | "m" | "μ" | "n" | "p" | "f" | "a" | "z" | "y"
            ; Single character prefix to indicate a multiple or fraction
            ; of the unit. All SI prefixes are supported except for deca.
            ; An empty prefix signifies no scaling.
<name>     ::= <string>
            ; One of the defined units, case sensitive, containing Latin
            ; or Greek symbols.
<power>    ::= "" | <integer>
            ; Integer power to which to raise the unit. An empty power is
            ; equivalent to 1.
<operator> ::= "*" | "/"
            ; Multiplication or division.

With the prefix and unit name sharing an alphabet there is potential for ambiguities (is it mol or micro-ol?). These are resolved using the simple logic that the first character is considered part of the unit if this unit exists; otherwise it is considered a prefix.

nutils.unit.create(_typename='unit', **units)

Create new unit type.

The unit system is defined via variable keyword arguments, with every unit specified either as a direct numerical value or as a string referencing other units using the standard expression syntax. Ultimately every unit should be resolvable to a numerical value by tracing its dependencies.

The following example defines a subset of the SI system. Note that we cannot use prefixes on the receiving end of a definition for reasons of ambiguity, hence the definition of a gram as 1/1000:

>>> SI = create(m=1, s=1, g=1e-3, N='kg*m/s2', Pa='N/m2')
>>> SI('2km')
2000.0
>>> SI('2g')
0.002
Parameters:
  • name (str (optional, positional only)) – Name of the new class object.

  • **units – Unit definitions.

Returns:

The newly created (uninitiated) unit class.