cyquant
=======
simple, efficient dimensional analysis
## basics
```python
from cyquant import si, SIUnit
miles = SIUnit(1609.344) * si.meters
marathon_miles = 26 * miles
marathon_miles.quantity # 26
marathon_meters = marathon_miles.cvt_to(si.meters)
marathon_meters.quantity # 41842.944
marathon_meters.get_as(miles) # 26
marathon_meters.get_as(si.newton_meters) # ValueError
marathon_miles == marathon_meters # True
```
## approximation & tolerances
```python
# absolute tolerance
marathon_miles.a_approx(marathon_meters, atol=1e-9) # True
# relative tolerance
marathon_miles.r_approx(marathon_meters, rtol=1e-9) # True
# quantity tolerance
marathon_miles.q_approx(marathon_meters, qtol=1 * si.millimeters)
```
## normalized string output
```python
from cyquant.format_quantity import show_quantity
show_quantity(marathon_miles) # 4.184e+04 m
```
## with attrs
```python
from cyquant import si, converter
from cyquant import Quantity as Q
from attrs import define, field
@define
class Foo:
mass: Q = field(converter=converter(si.kilograms, promotes=True))
size: Q = field(converter=converter(si.meters ** 3))
def liters(self):
return self.size.get_as(si.liters)
foo1 = Foo(mass=10, size=1 * si.meters ** 3)
foo2 = Foo(mass=10 * si.kilograms, size=1000000000 * si.millimeters ** 3)
assert foo1 == foo2
foo3 = Foo(mass=10, size=10) # TypeError
```
Raw data
{
"_id": null,
"home_page": null,
"name": "cyquantx",
"maintainer": null,
"docs_url": null,
"requires_python": ">=3.9",
"maintainer_email": null,
"keywords": "c-extension, SI, units, quantities, dimensional analysis",
"author": null,
"author_email": "Greg Echelberger <gechelberger@gmail.com>",
"download_url": "https://files.pythonhosted.org/packages/f0/a2/9efa269e960f9fb67126b18aad2551394236c92f72c18f4290e062776f0f/cyquantx-1.1.0.tar.gz",
"platform": null,
"description": "cyquant\n=======\n\nsimple, efficient dimensional analysis\n\n## basics\n\n```python\nfrom cyquant import si, SIUnit\n\nmiles = SIUnit(1609.344) * si.meters\nmarathon_miles = 26 * miles\nmarathon_miles.quantity # 26\n\nmarathon_meters = marathon_miles.cvt_to(si.meters)\nmarathon_meters.quantity # 41842.944\nmarathon_meters.get_as(miles) # 26\nmarathon_meters.get_as(si.newton_meters) # ValueError\nmarathon_miles == marathon_meters # True\n```\n\n## approximation & tolerances\n\n```python\n# absolute tolerance\nmarathon_miles.a_approx(marathon_meters, atol=1e-9) # True\n\n# relative tolerance\nmarathon_miles.r_approx(marathon_meters, rtol=1e-9) # True\n\n# quantity tolerance\nmarathon_miles.q_approx(marathon_meters, qtol=1 * si.millimeters)\n```\n\n## normalized string output\n\n```python\nfrom cyquant.format_quantity import show_quantity\nshow_quantity(marathon_miles) # 4.184e+04 m\n```\n\n## with attrs\n\n```python\nfrom cyquant import si, converter\nfrom cyquant import Quantity as Q\nfrom attrs import define, field\n\n@define\nclass Foo:\n mass: Q = field(converter=converter(si.kilograms, promotes=True))\n size: Q = field(converter=converter(si.meters ** 3))\n\n def liters(self):\n return self.size.get_as(si.liters)\n\nfoo1 = Foo(mass=10, size=1 * si.meters ** 3)\nfoo2 = Foo(mass=10 * si.kilograms, size=1000000000 * si.millimeters ** 3)\nassert foo1 == foo2\n\nfoo3 = Foo(mass=10, size=10) # TypeError\n```\n",
"bugtrack_url": null,
"license": null,
"summary": "cython dimensional analysis and unit tracking utility",
"version": "1.1.0",
"project_urls": null,
"split_keywords": [
"c-extension",
" si",
" units",
" quantities",
" dimensional analysis"
],
"urls": [
{
"comment_text": null,
"digests": {
"blake2b_256": "f0a29efa269e960f9fb67126b18aad2551394236c92f72c18f4290e062776f0f",
"md5": "40e08d872dda6bbddaa9f759e668f0b6",
"sha256": "7b481ca9dfbb86b9efb24c6e7db96d8e9da7eb52dc9e63fec48422c3a4bea9fe"
},
"downloads": -1,
"filename": "cyquantx-1.1.0.tar.gz",
"has_sig": false,
"md5_digest": "40e08d872dda6bbddaa9f759e668f0b6",
"packagetype": "sdist",
"python_version": "source",
"requires_python": ">=3.9",
"size": 429910,
"upload_time": "2025-07-28T18:23:32",
"upload_time_iso_8601": "2025-07-28T18:23:32.488149Z",
"url": "https://files.pythonhosted.org/packages/f0/a2/9efa269e960f9fb67126b18aad2551394236c92f72c18f4290e062776f0f/cyquantx-1.1.0.tar.gz",
"yanked": false,
"yanked_reason": null
}
],
"upload_time": "2025-07-28 18:23:32",
"github": false,
"gitlab": false,
"bitbucket": false,
"codeberg": false,
"lcname": "cyquantx"
}