pHcalc
######
*pHcalc* is a Python library for systematically calculating solution pH,
distribution diagrams, and titration curves.
This package is Python3 compatible with dependencies_ only on Numpy and
Scipy. If you will be plotting the data, then there is an `optional
dependency`_ on Matplotlib as well.
.. _dependencies:
Dependencies
------------
* Numpy >= 1.10
* Scipy >= 0.17
.. _optional dependency:
Optional Packages
-----------------
* Matplotlib >= 1.5
Installation
------------
*pHcalc* is available via ``pip``, ``conda``, or the `GitHub repo`_ (most
recent).
From PyPI::
$ pip install pHcalc
Via Conda::
$ conda install -c rnelsonchem pHcalc
If you have ``git`` installed on your system, then you can get the most
recent, unrelased version from the `GitHub repo`_::
$ pip install git+https://github.com/rnelsonchem/pHcalc.git
Background
##########
*pHcalc* calculates the pH of a complex system of potentially strong and weak
acids and bases using a systematic equilibrium solution method. This method is
described in detail in `the Journal of Chemical Education`_ and in this
`ChemWiki article`_, for example. (There is also another, older Pascal program
called PHCALC_, which uses matrix algebra to accomplish the same task. To the
best of my knowledge, the source code for this program is no longer
available.)
Basically, this method finds the optimum pH for the mixture by systematically
adjusting the pH until a charge balance is achieved, i.e. the concentrations
of positively charged ions equals the charge for the negatively charged ions.
For (polyprotic) weak acids, the fractional distribution of the species
at a given pH value is determined. Multiplying this by the concentration of
acid in solution provides the concentration of each acidic species in the
system, and these concentrations are used to balance the charge.
Using this methodology bases and strong acids can be described using inert,
charged species. These are ions that do not react with water, such as |Na+|
and |Cl-|. In this context, any |Cl-| in solution must be charged balanced
with an appropriate amount of |H3O|, which would define HCl in solution.
|Na+| must be offset by an equivalent amount of |OH-|, which defines a
solution of NaOH. A 1:1 combination of |Na+| and |H2CO3| would describe a
solution of |NaHCO3|, the additional equivalent of |OH-| is implied by the
charge imbalance.
Example Usage
#############
*pHcalc* defines three classes - Acid, Inert, and System - which are used in
calculating the pH of the system. |H3O| and |OH-| are never explicitly
defined. The |H3O| concentration is adjusted internally, and |OH-| is
calculated using K\ :sub:`W`\ .
.. code:: python
>>> from pHcalc import Acid, Inert, System
>>> import numpy as np
>>> import matplotlib.pyplot as plt # Optional for plotting below
pH of 0.01 M HCl
----------------
First of all, HCl completely dissociates in water to give equal amounts of
|H3O| and |Cl-|. Because |H3O| is adjusted internally, all you need to define
is |Cl-|. This implies a single equivalent of |H3O| in order to balance the
charge of the system.
.. code:: python
>>> cl = Inert(charge=-1, conc=0.01)
>>> system = System(cl)
>>> system.pHsolve()
>>> print(system.pH) # Should print 1.9999
pH of 1e-8 M HCl
----------------
This is a notoriously tricky example for introductory chemistry students;
however, *pHcalc* handles it nicely.
.. code:: python
>>> cl = Inert(charge=-1, conc=1e-8)
>>> system = System(cl)
>>> system.pHsolve()
>>> print(system.pH) # Should print 6.978295898 (NOT 8!)
pH of 0.01 M NaOH
-----------------
This example is very similar to our HCl example, except that our Inert
species must have a positive charge. The charge balance is achieved internally
by the System using an equivalent amount of |OH-|.
.. code:: python
>>> na = Inert(charge=1, conc=0.01)
>>> system = System(na)
>>> system.pHsolve()
>>> print(system.pH) # Should print 12.00000
pH of 0.01 M HF
---------------
Here we will use an Acid object instance to define the weak acid HF, which has
a |Ka| of 6.76e-4 and a |pKa| of 3.17. You can use either value when you
create the Acid instance. When defining an Acid species, you must always
define a ``charge`` keyword argument, which is the charge of the *fully
protonated species*.
.. code:: python
>>> hf = Acid(Ka=6.76e-4, charge=0, conc=0.01)
>>> # hf = Acid(pKa=3.17, charge=0, conc=0.01) will also work
>>> system = System(hf)
>>> system.pHsolve()
>>> print(system.pH) # Should print 2.6413261
pH of 0.01 M NaF
----------------
This system consist of a 1:1 mixture of an HF Acid instance and a |Na+|
Inert instance. The System object can be instantiated with an arbitrary
number of Acids and Inert objects. Again, there is an implied equivalent of
|OH-| necessary to balance the charge of the system.
.. code:: python
>>> hf = Acid(Ka=6.76e-4, charge=0, conc=0.01)
>>> na = Inert(charge=1, conc=0.01)
>>> system = System(hf, na)
>>> system.pHsolve()
>>> print(system.pH) # Should print 7.5992233
pH of 0.01 M |H2CO3|
--------------------
The |Ka| and |pKa| attributes can also accept lists of values for polyprotic
species.
.. code:: python
>>> carbonic = Acid(pKa=[6.35, 10.33], charge=0, conc=0.01)
>>> system = System(carbonic)
>>> system.pHsolve()
>>> print(system.pH) # Should print 4.176448
pH of 0.01 M Alanine Zwitterion Form
------------------------------------
Alanine has two pKa values, 2.35 and 9.69, but the fully protonated form is
positively charged. In order to define the neutral zwitterion, only the
positively charged Acid object needs to be defined. The charge balance in this
case implies a single equivalent of |OH-|.
.. code:: python
>>> ala = Acid(pKa=[2.35, 9.69], charge=1, conc=0.01)
>>> system = System(ala)
>>> system.pHsolve()
>>> print(system.pH) # Should print 6.0991569
pH of 0.01 M |NH4PO4|
---------------------
This is equivalent to a 1:3 mixture of |H3PO4| and |NH4|, both of which are
defined by Acid objects. Three equivalents of |OH-| are implied to balance the
charge of the system.
.. code:: python
>>> phos = Acid(pKa=[2.148, 7.198, 12.319], charge=0, conc=0.01)
>>> nh4 = Acid(pKa=9.25, charge=1, conc=0.01*3)
>>> system = System(phos, nh4)
>>> system.pHsolve()
>>> print(system.pH) # Should print 8.95915298
Distribution Diagrams
---------------------
Acid objects also define a function called ``alpha``, which calculates the
fractional distribution of species at a given pH. This function can be used to
create distribution diagrams for weak acid species. ``alpha`` takes a single
argument, which is a single pH value or a Numpy array of values. For a single
pH value, the function returns a Numpy array of fractional distributions
ordered from most acid to least acidic species.
.. code:: python
>>> phos = Acid(pKa=[2.148, 7.198, 12.319], charge=0, conc=0.01)
>>> phos.alpha(7.0)
array([ 8.6055e-06, 6.1204e-01, 3.8795e-01, 1.8611e-06])
>>> # This is H3PO4, H2PO4-, HPO4_2-, and HPO4_3-
For a Numpy array og pH values, a 2D array of fractional distribution values
is returned, where each row is a series of distributions for each given pH.
The 2D returned array can be used to plot a distribution diagram.
.. code:: python
>>> phos = Acid(pKa=[2.148, 7.198, 12.319], charge=0, conc=0.01)
>>> phs = np.linspace(0, 14, 1000)
>>> fracs = phos.alpha(phs)
>>> plt.plot(phs, fracs)
>>> plt.legend(['H3PO4', 'H2PO4^1-', 'HPO4^2-', 'PO4^3-'])
>>> plt.show()
.. image:: ./_static/dist_diagram.png
Titration Curves
----------------
Using a simple loop, we can also construct arbitrary titration curves as well.
In this example, we will titrate |H3PO4| with NaOH. The ``guess_est`` keyword
argument for the ``System.pHsolve`` method forces the calculation of a best
guess for starting the pH optimization algorithm. This may speed up the
evaluation of the pH and can also be used if the minimizer throws an error
during the pH calculation.
.. code:: python
>>> na_moles = np.linspace(1e-8, 5.e-3, 500)
>>> sol_volume = 1. # Liter
>>> phos = Acid(pKa=[2.148, 7.198, 12.375], charge=0, conc=1.e-3)
>>> phs = []
>>> for mol in na_moles:
>>> na = Inert(charge=1, conc=mol/sol_volume)
>>> system = System(phos, na)
>>> system.pHsolve(guess_est=True)
>>> phs.append(system.pH)
>>> plt.plot(na_moles, phs)
>>> plt.show()
.. image:: ./_static/titration_crv.png
.. Substitutions
.. |Na+| replace:: Na\ :sup:`+`
.. |Cl-| replace:: Cl\ :sup:`-`
.. |H3O| replace:: H\ :sub:`3`\ O\ :sup:`+`
.. |OH-| replace:: OH\ :sup:`-`
.. |H2CO3| replace:: H\ :sub:`2`\ CO\ :sub:`3`
.. |NaHCO3| replace:: NaHCO\ :sub:`3`
.. |Ka| replace:: K\ :sub:`a`
.. |pKa| replace:: pK\ :sub:`a`
.. |NH4PO4| replace:: (NH\ :sub:`4`\ )\ :sub:`3`\ PO\ :sub:`4`
.. |H3PO4| replace:: H\ :sub:`3`\ PO\ :sub:`4`
.. |NH4| replace:: NH\ :sub:`4`\ :sup:`+`
.. External Hyperlinks
.. _GitHub repo: https://github.com/rnelsonchem/pHcalc
.. _PyPI: https://pypi.python.org/pypi/pHcalc
.. _the Journal of Chemical Education:
http://pubs.acs.org/doi/abs/10.1021/ed100784v
.. _ChemWiki article:
http://chemwiki.ucdavis.edu/Core/Analytical_Chemistry/Analytical_Chemistry_2.0/06_Equilibrium_Chemistry/6G%3A_Solving_Equilibrium_Problems#6G.3_A_Systematic_Approach_to_Solving_Equilibrium_Problems
.. _PHCALC: http://pubs.acs.org/doi/pdf/10.1021/ed071p119
Raw data
{
"_id": null,
"home_page": "",
"name": "pHcalc",
"maintainer": "",
"docs_url": null,
"requires_python": ">=3.5",
"maintainer_email": "",
"keywords": "pH,systematic,distribution,titration,acid,base",
"author": "",
"author_email": "Ryan Nelson <rnelsonchem@gmail.com>",
"download_url": "https://files.pythonhosted.org/packages/79/f1/3dab34b5f59dae175fdeca8e7de2f15cbb0ece07109e9fbca569602d8dac/pHcalc-0.2.0.tar.gz",
"platform": null,
"description": "pHcalc\r\n######\r\n\r\n*pHcalc* is a Python library for systematically calculating solution pH,\r\ndistribution diagrams, and titration curves.\r\n\r\nThis package is Python3 compatible with dependencies_ only on Numpy and\r\nScipy. If you will be plotting the data, then there is an `optional\r\ndependency`_ on Matplotlib as well. \r\n\r\n.. _dependencies:\r\n\r\nDependencies\r\n------------\r\n\r\n* Numpy >= 1.10\r\n\r\n* Scipy >= 0.17\r\n\r\n.. _optional dependency:\r\n\r\nOptional Packages\r\n-----------------\r\n\r\n* Matplotlib >= 1.5\r\n\r\nInstallation\r\n------------\r\n\r\n*pHcalc* is available via ``pip``, ``conda``, or the `GitHub repo`_ (most\r\nrecent).\r\n\r\nFrom PyPI::\r\n\r\n $ pip install pHcalc\r\n\r\nVia Conda::\r\n\r\n $ conda install -c rnelsonchem pHcalc\r\n\r\nIf you have ``git`` installed on your system, then you can get the most\r\nrecent, unrelased version from the `GitHub repo`_::\r\n\r\n $ pip install git+https://github.com/rnelsonchem/pHcalc.git\r\n\r\n\r\n\r\nBackground\r\n##########\r\n\r\n*pHcalc* calculates the pH of a complex system of potentially strong and weak\r\nacids and bases using a systematic equilibrium solution method. This method is\r\ndescribed in detail in `the Journal of Chemical Education`_ and in this\r\n`ChemWiki article`_, for example. (There is also another, older Pascal program\r\ncalled PHCALC_, which uses matrix algebra to accomplish the same task. To the\r\nbest of my knowledge, the source code for this program is no longer\r\navailable.)\r\n\r\nBasically, this method finds the optimum pH for the mixture by systematically\r\nadjusting the pH until a charge balance is achieved, i.e. the concentrations\r\nof positively charged ions equals the charge for the negatively charged ions.\r\nFor (polyprotic) weak acids, the fractional distribution of the species\r\nat a given pH value is determined. Multiplying this by the concentration of\r\nacid in solution provides the concentration of each acidic species in the\r\nsystem, and these concentrations are used to balance the charge.\r\n\r\nUsing this methodology bases and strong acids can be described using inert,\r\ncharged species. These are ions that do not react with water, such as |Na+|\r\nand |Cl-|. In this context, any |Cl-| in solution must be charged balanced\r\nwith an appropriate amount of |H3O|, which would define HCl in solution.\r\n|Na+| must be offset by an equivalent amount of |OH-|, which defines a\r\nsolution of NaOH. A 1:1 combination of |Na+| and |H2CO3| would describe a\r\nsolution of |NaHCO3|, the additional equivalent of |OH-| is implied by the\r\ncharge imbalance.\r\n\r\nExample Usage\r\n#############\r\n\r\n*pHcalc* defines three classes - Acid, Inert, and System - which are used in\r\ncalculating the pH of the system. |H3O| and |OH-| are never explicitly\r\ndefined. The |H3O| concentration is adjusted internally, and |OH-| is\r\ncalculated using K\\ :sub:`W`\\ .\r\n\r\n.. code:: python\r\n\r\n >>> from pHcalc import Acid, Inert, System\r\n >>> import numpy as np\r\n >>> import matplotlib.pyplot as plt # Optional for plotting below\r\n\r\npH of 0.01 M HCl\r\n----------------\r\n\r\nFirst of all, HCl completely dissociates in water to give equal amounts of\r\n|H3O| and |Cl-|. Because |H3O| is adjusted internally, all you need to define\r\nis |Cl-|. This implies a single equivalent of |H3O| in order to balance the\r\ncharge of the system.\r\n\r\n.. code:: python\r\n\r\n >>> cl = Inert(charge=-1, conc=0.01)\r\n >>> system = System(cl)\r\n >>> system.pHsolve()\r\n >>> print(system.pH) # Should print 1.9999\r\n\r\npH of 1e-8 M HCl\r\n----------------\r\n\r\nThis is a notoriously tricky example for introductory chemistry students;\r\nhowever, *pHcalc* handles it nicely.\r\n\r\n.. code:: python\r\n\r\n >>> cl = Inert(charge=-1, conc=1e-8)\r\n >>> system = System(cl)\r\n >>> system.pHsolve()\r\n >>> print(system.pH) # Should print 6.978295898 (NOT 8!)\r\n\r\npH of 0.01 M NaOH\r\n-----------------\r\n\r\nThis example is very similar to our HCl example, except that our Inert\r\nspecies must have a positive charge. The charge balance is achieved internally\r\nby the System using an equivalent amount of |OH-|.\r\n\r\n.. code:: python\r\n\r\n >>> na = Inert(charge=1, conc=0.01)\r\n >>> system = System(na)\r\n >>> system.pHsolve()\r\n >>> print(system.pH) # Should print 12.00000\r\n\r\npH of 0.01 M HF\r\n---------------\r\n\r\nHere we will use an Acid object instance to define the weak acid HF, which has\r\na |Ka| of 6.76e-4 and a |pKa| of 3.17. You can use either value when you\r\ncreate the Acid instance. When defining an Acid species, you must always\r\ndefine a ``charge`` keyword argument, which is the charge of the *fully\r\nprotonated species*.\r\n\r\n.. code:: python\r\n\r\n >>> hf = Acid(Ka=6.76e-4, charge=0, conc=0.01)\r\n >>> # hf = Acid(pKa=3.17, charge=0, conc=0.01) will also work\r\n >>> system = System(hf)\r\n >>> system.pHsolve()\r\n >>> print(system.pH) # Should print 2.6413261\r\n\r\npH of 0.01 M NaF\r\n----------------\r\n\r\nThis system consist of a 1:1 mixture of an HF Acid instance and a |Na+|\r\nInert instance. The System object can be instantiated with an arbitrary\r\nnumber of Acids and Inert objects. Again, there is an implied equivalent of\r\n|OH-| necessary to balance the charge of the system.\r\n\r\n.. code:: python\r\n\r\n >>> hf = Acid(Ka=6.76e-4, charge=0, conc=0.01)\r\n >>> na = Inert(charge=1, conc=0.01)\r\n >>> system = System(hf, na)\r\n >>> system.pHsolve()\r\n >>> print(system.pH) # Should print 7.5992233\r\n\r\n\r\npH of 0.01 M |H2CO3|\r\n--------------------\r\n\r\nThe |Ka| and |pKa| attributes can also accept lists of values for polyprotic\r\nspecies.\r\n\r\n.. code:: python\r\n\r\n >>> carbonic = Acid(pKa=[6.35, 10.33], charge=0, conc=0.01)\r\n >>> system = System(carbonic)\r\n >>> system.pHsolve()\r\n >>> print(system.pH) # Should print 4.176448\r\n\r\npH of 0.01 M Alanine Zwitterion Form\r\n------------------------------------\r\n\r\nAlanine has two pKa values, 2.35 and 9.69, but the fully protonated form is\r\npositively charged. In order to define the neutral zwitterion, only the\r\npositively charged Acid object needs to be defined. The charge balance in this\r\ncase implies a single equivalent of |OH-|. \r\n\r\n.. code:: python \r\n\r\n >>> ala = Acid(pKa=[2.35, 9.69], charge=1, conc=0.01)\r\n >>> system = System(ala)\r\n >>> system.pHsolve()\r\n >>> print(system.pH) # Should print 6.0991569\r\n\r\npH of 0.01 M |NH4PO4|\r\n---------------------\r\n\r\nThis is equivalent to a 1:3 mixture of |H3PO4| and |NH4|, both of which are\r\ndefined by Acid objects. Three equivalents of |OH-| are implied to balance the\r\ncharge of the system.\r\n\r\n.. code:: python\r\n\r\n >>> phos = Acid(pKa=[2.148, 7.198, 12.319], charge=0, conc=0.01)\r\n >>> nh4 = Acid(pKa=9.25, charge=1, conc=0.01*3)\r\n >>> system = System(phos, nh4)\r\n >>> system.pHsolve()\r\n >>> print(system.pH) # Should print 8.95915298\r\n\r\nDistribution Diagrams\r\n---------------------\r\n\r\nAcid objects also define a function called ``alpha``, which calculates the\r\nfractional distribution of species at a given pH. This function can be used to\r\ncreate distribution diagrams for weak acid species. ``alpha`` takes a single\r\nargument, which is a single pH value or a Numpy array of values. For a single\r\npH value, the function returns a Numpy array of fractional distributions\r\nordered from most acid to least acidic species. \r\n\r\n.. code:: python\r\n\r\n >>> phos = Acid(pKa=[2.148, 7.198, 12.319], charge=0, conc=0.01)\r\n >>> phos.alpha(7.0)\r\n array([ 8.6055e-06, 6.1204e-01, 3.8795e-01, 1.8611e-06])\r\n >>> # This is H3PO4, H2PO4-, HPO4_2-, and HPO4_3-\r\n\r\nFor a Numpy array og pH values, a 2D array of fractional distribution values\r\nis returned, where each row is a series of distributions for each given pH.\r\nThe 2D returned array can be used to plot a distribution diagram. \r\n\r\n.. code:: python\r\n\r\n >>> phos = Acid(pKa=[2.148, 7.198, 12.319], charge=0, conc=0.01)\r\n >>> phs = np.linspace(0, 14, 1000)\r\n >>> fracs = phos.alpha(phs)\r\n >>> plt.plot(phs, fracs)\r\n >>> plt.legend(['H3PO4', 'H2PO4^1-', 'HPO4^2-', 'PO4^3-'])\r\n >>> plt.show()\r\n\r\n.. image:: ./_static/dist_diagram.png\r\n\r\nTitration Curves\r\n----------------\r\n\r\nUsing a simple loop, we can also construct arbitrary titration curves as well.\r\nIn this example, we will titrate |H3PO4| with NaOH. The ``guess_est`` keyword\r\nargument for the ``System.pHsolve`` method forces the calculation of a best\r\nguess for starting the pH optimization algorithm. This may speed up the\r\nevaluation of the pH and can also be used if the minimizer throws an error\r\nduring the pH calculation. \r\n\r\n.. code:: python\r\n\r\n >>> na_moles = np.linspace(1e-8, 5.e-3, 500)\r\n >>> sol_volume = 1. # Liter\r\n >>> phos = Acid(pKa=[2.148, 7.198, 12.375], charge=0, conc=1.e-3)\r\n >>> phs = []\r\n >>> for mol in na_moles:\r\n >>> na = Inert(charge=1, conc=mol/sol_volume)\r\n >>> system = System(phos, na)\r\n >>> system.pHsolve(guess_est=True)\r\n >>> phs.append(system.pH)\r\n >>> plt.plot(na_moles, phs)\r\n >>> plt.show()\r\n\r\n.. image:: ./_static/titration_crv.png\r\n\r\n\r\n.. Substitutions\r\n\r\n\r\n.. |Na+| replace:: Na\\ :sup:`+`\r\n.. |Cl-| replace:: Cl\\ :sup:`-`\r\n.. |H3O| replace:: H\\ :sub:`3`\\ O\\ :sup:`+`\r\n.. |OH-| replace:: OH\\ :sup:`-`\r\n.. |H2CO3| replace:: H\\ :sub:`2`\\ CO\\ :sub:`3`\r\n.. |NaHCO3| replace:: NaHCO\\ :sub:`3`\r\n.. |Ka| replace:: K\\ :sub:`a`\r\n.. |pKa| replace:: pK\\ :sub:`a`\r\n.. |NH4PO4| replace:: (NH\\ :sub:`4`\\ )\\ :sub:`3`\\ PO\\ :sub:`4`\r\n.. |H3PO4| replace:: H\\ :sub:`3`\\ PO\\ :sub:`4`\r\n.. |NH4| replace:: NH\\ :sub:`4`\\ :sup:`+`\r\n\r\n.. External Hyperlinks\r\n\r\n.. _GitHub repo: https://github.com/rnelsonchem/pHcalc\r\n.. _PyPI: https://pypi.python.org/pypi/pHcalc\r\n.. _the Journal of Chemical Education:\r\n http://pubs.acs.org/doi/abs/10.1021/ed100784v\r\n.. _ChemWiki article: \r\n http://chemwiki.ucdavis.edu/Core/Analytical_Chemistry/Analytical_Chemistry_2.0/06_Equilibrium_Chemistry/6G%3A_Solving_Equilibrium_Problems#6G.3_A_Systematic_Approach_to_Solving_Equilibrium_Problems\r\n.. _PHCALC: http://pubs.acs.org/doi/pdf/10.1021/ed071p119\r\n",
"bugtrack_url": null,
"license": "BSD-3-Clause",
"summary": "Systematic pH calculation package for Python",
"version": "0.2.0",
"split_keywords": [
"ph",
"systematic",
"distribution",
"titration",
"acid",
"base"
],
"urls": [
{
"comment_text": "",
"digests": {
"blake2b_256": "7d5315f300cfaca17634d99dc3b429d8fd28f56252fb95c4aef92b7d6e00bfde",
"md5": "b32176187745e11f14ec6d8a4cce9236",
"sha256": "403b08df0755821f3c61b4062d629332cb2feb1ac2f6f65346b016af68709beb"
},
"downloads": -1,
"filename": "pHcalc-0.2.0-py3-none-any.whl",
"has_sig": false,
"md5_digest": "b32176187745e11f14ec6d8a4cce9236",
"packagetype": "bdist_wheel",
"python_version": "py3",
"requires_python": ">=3.5",
"size": 9478,
"upload_time": "2023-03-22T21:23:02",
"upload_time_iso_8601": "2023-03-22T21:23:02.435314Z",
"url": "https://files.pythonhosted.org/packages/7d/53/15f300cfaca17634d99dc3b429d8fd28f56252fb95c4aef92b7d6e00bfde/pHcalc-0.2.0-py3-none-any.whl",
"yanked": false,
"yanked_reason": null
},
{
"comment_text": "",
"digests": {
"blake2b_256": "79f13dab34b5f59dae175fdeca8e7de2f15cbb0ece07109e9fbca569602d8dac",
"md5": "cefe7db3c85ee93d715fbdd210dfc007",
"sha256": "692aa59d92b5a3c2ce90f947be3166fd8964adb9246bd81d67b1c347f5713317"
},
"downloads": -1,
"filename": "pHcalc-0.2.0.tar.gz",
"has_sig": false,
"md5_digest": "cefe7db3c85ee93d715fbdd210dfc007",
"packagetype": "sdist",
"python_version": "source",
"requires_python": ">=3.5",
"size": 12414,
"upload_time": "2023-03-22T21:23:06",
"upload_time_iso_8601": "2023-03-22T21:23:06.090604Z",
"url": "https://files.pythonhosted.org/packages/79/f1/3dab34b5f59dae175fdeca8e7de2f15cbb0ece07109e9fbca569602d8dac/pHcalc-0.2.0.tar.gz",
"yanked": false,
"yanked_reason": null
}
],
"upload_time": "2023-03-22 21:23:06",
"github": false,
"gitlab": false,
"bitbucket": false,
"lcname": "phcalc"
}