Working with Units¶
The mendeleev package provides built-in support for accessing physical properties with their proper units using the Pint library.
Simply append _u to any property name to get a pint.Quantity object with units attached.
Basic Usage¶
[1]:
from mendeleev import H, C, Al, Fe
# Without units (raw numbers, same as always)
print(f"H atomic weight: {H.atomic_weight}")
print(f"C density: {C.density}")
# With units (pint Quantity objects)
print(f"H atomic weight: {H.atomic_weight_u}")
print(f"C density: {C.density_u}")
H atomic weight: 1.008
C density: 2.2
H atomic weight: 1.008 dalton
C density: 2.2 gram / centimeter ** 3
Unit Conversions¶
The returned objects are Pint Quantity instances that support unit conversions:
[2]:
# Temperature conversions
al_melting = Al.melting_point_u
print(f"Kelvin: {al_melting}")
print(f"Celsius: {al_melting.to('celsius')}")
print(f"Fahrenheit: {al_melting.to('fahrenheit')}")
Kelvin: 933.473 kelvin
Celsius: 660.323 degree_Celsius
Fahrenheit: 1220.5813999999998 degree_Fahrenheit
[3]:
# Length conversions
fe_radius = Fe.atomic_radius_u
print(f"Picometers: {fe_radius}")
print(f"Angstroms: {fe_radius.to('angstrom')}")
print(f"Nanometers: {fe_radius.to('nanometer')}")
Picometers: 140.0 picometer
Angstroms: 1.4000000000000001 angstrom
Nanometers: 0.13999999999999999 nanometer
Calculations with Units¶
pint Quantities support arithmetic while preserving dimensional correctness:
[4]:
from mendeleev.models import ureg
# Calculate mass of a volume of aluminum
density = Al.density_u
volume = 100 * ureg.milliliter
mass = density * volume
print(f"Density: {density}")
print(f"Volume: {volume}")
print(f"Mass: {mass.to('gram')}")
Density: 2.7 gram / centimeter ** 3
Volume: 100 milliliter
Mass: 270.00000000000006 gram
[5]:
# Convert electron affinity to different energy units
fe_ea = Fe.electron_affinity_u
print(f"Electron affinity: {fe_ea}")
print(f"In joules: {fe_ea.to('joule')}")
Electron affinity: 0.151 electron_volt
In joules: 2.4192867173399996e-20 joule
Working with Multiple Elements¶
Units make it easy to compare properties across elements:
[6]:
elements = [Al, Fe, H, C]
print("Element densities:")
for el in elements:
d = el.density_u
if d is not None:
print(f" {el.name}: {d}")
else:
print(f" {el.name}: no data")
Element densities:
Aluminum: 2.7 gram / centimeter ** 3
Iron: 7.87 gram / centimeter ** 3
Hydrogen: 8.2e-05 gram / centimeter ** 3
Carbon: 2.2 gram / centimeter ** 3
Handling Missing Data¶
Properties with None values return None when accessed with _u. Properties without units defined raise AttributeError.
[7]:
# None values stay None
print(f"H gas_basicity: {H.gas_basicity}")
print(f"H gas_basicity with units: {H.gas_basicity_u}")
# Properties without units raise AttributeError
try:
print(H.symbol_u)
except AttributeError as e:
print(f"Error: {e}")
H gas_basicity: None
H gas_basicity with units: None
Error: 'Element' has no unit defined for 'symbol'
Ionic Radii with Units¶
Other model classes like IonicRadius also support the _u suffix:
[8]:
from mendeleev.db import get_session
from mendeleev.models import IonicRadius
session = get_session()
ionic = session.query(IonicRadius).first()
print(f"Charge: {ionic.charge_u}")
print(f"Ionic radius: {ionic.ionic_radius_u}")
print(f"Crystal radius: {ionic.crystal_radius_u}")
session.close()
Charge: 3 elementary_charge
Ionic radius: 112.00000000000001 picometer
Crystal radius: 126.0 picometer
Summary¶
The _u suffix provides:
Convenience — append
_uto any property for unitsConversions — use
.to()to convert between unit systemsSafety — pint catches dimension mismatches in calculations
Transparency — no guessing what units a number is in
See the units reference for the complete list of properties with units.