Spaces:
Sleeping
Sleeping
| """ | |
| This module exports all latin and greek letters as Symbols, so you can | |
| conveniently do | |
| >>> from sympy.abc import x, y | |
| instead of the slightly more clunky-looking | |
| >>> from sympy import symbols | |
| >>> x, y = symbols('x y') | |
| Caveats | |
| ======= | |
| 1. As of the time of writing this, the names ``O``, ``S``, ``I``, ``N``, | |
| ``E``, and ``Q`` are colliding with names defined in SymPy. If you import them | |
| from both ``sympy.abc`` and ``sympy``, the second import will "win". | |
| This is an issue only for * imports, which should only be used for short-lived | |
| code such as interactive sessions and throwaway scripts that do not survive | |
| until the next SymPy upgrade, where ``sympy`` may contain a different set of | |
| names. | |
| 2. This module does not define symbol names on demand, i.e. | |
| ``from sympy.abc import foo`` will be reported as an error because | |
| ``sympy.abc`` does not contain the name ``foo``. To get a symbol named ``foo``, | |
| you still need to use ``Symbol('foo')`` or ``symbols('foo')``. | |
| You can freely mix usage of ``sympy.abc`` and ``Symbol``/``symbols``, though | |
| sticking with one and only one way to get the symbols does tend to make the code | |
| more readable. | |
| The module also defines some special names to help detect which names clash | |
| with the default SymPy namespace. | |
| ``_clash1`` defines all the single letter variables that clash with | |
| SymPy objects; ``_clash2`` defines the multi-letter clashing symbols; | |
| and ``_clash`` is the union of both. These can be passed for ``locals`` | |
| during sympification if one desires Symbols rather than the non-Symbol | |
| objects for those names. | |
| Examples | |
| ======== | |
| from sympy import S | |
| from sympy.abc import _clash1, _clash2, _clash | |
| S("Q & C", locals=_clash1) | |
| C & Q | |
| S('pi(x)', locals=_clash2) | |
| pi(x) | |
| S('pi(C, Q)', locals=_clash) | |
| pi(C, Q) | |
| """ | |
| from typing import Any, Dict as tDict | |
| import string | |
| from .core import Symbol, symbols | |
| from .core.alphabets import greeks | |
| from sympy.parsing.sympy_parser import null | |
| ##### Symbol definitions ##### | |
| # Implementation note: The easiest way to avoid typos in the symbols() | |
| # parameter is to copy it from the left-hand side of the assignment. | |
| a, b, c, d, e, f, g, h, i, j = symbols('a, b, c, d, e, f, g, h, i, j') | |
| k, l, m, n, o, p, q, r, s, t = symbols('k, l, m, n, o, p, q, r, s, t') | |
| u, v, w, x, y, z = symbols('u, v, w, x, y, z') | |
| A, B, C, D, E, F, G, H, I, J = symbols('A, B, C, D, E, F, G, H, I, J') | |
| K, L, M, N, O, P, Q, R, S, T = symbols('K, L, M, N, O, P, Q, R, S, T') | |
| U, V, W, X, Y, Z = symbols('U, V, W, X, Y, Z') | |
| alpha, beta, gamma, delta = symbols('alpha, beta, gamma, delta') | |
| epsilon, zeta, eta, theta = symbols('epsilon, zeta, eta, theta') | |
| iota, kappa, lamda, mu = symbols('iota, kappa, lamda, mu') | |
| nu, xi, omicron, pi = symbols('nu, xi, omicron, pi') | |
| rho, sigma, tau, upsilon = symbols('rho, sigma, tau, upsilon') | |
| phi, chi, psi, omega = symbols('phi, chi, psi, omega') | |
| ##### Clashing-symbols diagnostics ##### | |
| # We want to know which names in SymPy collide with those in here. | |
| # This is mostly for diagnosing SymPy's namespace during SymPy development. | |
| _latin = list(string.ascii_letters) | |
| # QOSINE should not be imported as they clash; gamma, pi and zeta clash, too | |
| _greek = list(greeks) # make a copy, so we can mutate it | |
| # Note: We import lamda since lambda is a reserved keyword in Python | |
| _greek.remove("lambda") | |
| _greek.append("lamda") | |
| ns: tDict[str, Any] = {} | |
| exec('from sympy import *', ns) | |
| _clash1: tDict[str, Any] = {} | |
| _clash2: tDict[str, Any] = {} | |
| while ns: | |
| _k, _ = ns.popitem() | |
| if _k in _greek: | |
| _clash2[_k] = null | |
| _greek.remove(_k) | |
| elif _k in _latin: | |
| _clash1[_k] = null | |
| _latin.remove(_k) | |
| _clash = {} | |
| _clash.update(_clash1) | |
| _clash.update(_clash2) | |
| del _latin, _greek, Symbol, _k, null | |