Skip to content

Commit ff7d1ab

Browse files
committed
SPEC 12: Formatting mathematical expressions
1 parent ec37a94 commit ff7d1ab

File tree

3 files changed

+125
-38
lines changed

3 files changed

+125
-38
lines changed

spec-0012/index.md

+125
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,125 @@
1+
---
2+
title: "SPEC 12 — Formatting mathematical expressions"
3+
number: 12
4+
date: 2024-06-06
5+
author:
6+
- "Pamphile Roy <[email protected]>"
7+
discussion: https://discuss.scientific-python.org/t/spec-12-formatting-mathematical-expressions
8+
endorsed-by:
9+
---
10+
11+
## Description
12+
13+
It is known that the PEP8 and other established styling documents are missing
14+
guidelines about mathematical expressions. This leads to people coming with
15+
their own interpretation and style. Standardizing the way we represent maths
16+
would lead to the same benefits seen with "normal" code. It brings consistency
17+
in the ecosystem improving the collaborative efforts.
18+
19+
This SPEC standardize the formatting of mathematical expressions.
20+
21+
## Implementation
22+
23+
The following rules must be followed.
24+
These rules respect and complement the PEP8 (relevant sections includes
25+
[id20](https://www.python.org/dev/peps/pep-0008/#id20) and
26+
[id20](https://www.python.org/dev/peps/pep-0008/#id28)).
27+
28+
We define a _group_ as a collection of operators having the same priority.
29+
e.g. `a + b + c` is a single group, `a + b * c` is composed of two groups `a`
30+
and `b * c`. A group is also a collection delimited with parenthesis.
31+
`(a + b * c)` is a group. And the whole expression by itself is a
32+
group.
33+
34+
- There a space before and after `-` and `+`. Except if
35+
the operator is used to define the sign of the number;
36+
37+
```
38+
a + b
39+
-a
40+
```
41+
42+
- Within a group, if operators with different priorities are used, add whitespace around the operators with the lowest priority(ies).
43+
44+
```
45+
a + b*c
46+
```
47+
48+
- There is no space before and after `**`.
49+
50+
```
51+
a**b
52+
```
53+
54+
- There is no space before and after operators `*` and `/`. Only exception is if the expression consist of a single operator linking two groups with more than one
55+
element.
56+
57+
```
58+
a*b
59+
(a*b) * (c*d)
60+
```
61+
62+
- Operators within a group are ordered from the lowest to the highest priority.
63+
If this is technically an issue (e.g. restriction on the AST), add
64+
parenthesis or spaces.
65+
66+
```
67+
a/d*b**c
68+
a*(b**c)/d
69+
a*b**c / d
70+
a * b**c / d
71+
```
72+
73+
- When splitting an equation, new lines should start with the operator linking
74+
the previous and next logical block. Single digit on a line are forbidden.
75+
76+
```
77+
(
78+
a/b
79+
+ c*d
80+
)
81+
```
82+
83+
### Examples
84+
85+
```python
86+
# good
87+
i = i + 1
88+
submitted += 1
89+
x = x*2 - 1
90+
hypot2 = x*x + y*y
91+
c = (a + b) * (a - b)
92+
dfdx = sign*(-2*x + 2*y + 2)
93+
result = 2*x**2 + 3*x**(2/3)
94+
y = 4*x**2 + 2*x + 1
95+
c_i1j = (
96+
1./n**2.
97+
*np.prod(
98+
0.5*(2. + abs(z_ij[i1, :]) + abs(z_ij) - abs(z_ij[i1, :] - z_ij)), axis=1
99+
)
100+
)
101+
```
102+
103+
```python
104+
# bad
105+
i = i + 1
106+
submitted += 1
107+
x = x * 2 - 1
108+
hypot2 = x * x + y * y
109+
c = (a + b) * (a - b)
110+
dfdx = sign * (-2 * x + 2 * y + 2)
111+
result = 2 * x ** 2 + 3 * x ** (2 / 3)
112+
y = 4 * x ** 2 + 2 * x + 1
113+
c_i1j = (
114+
1.0
115+
/ n ** 2.0
116+
* np.prod(
117+
0.5 * (2.0 + abs(z_ij[i1, :]) + abs(z_ij) - abs(z_ij[i1, :] - z_ij)), axis=1
118+
)
119+
)
120+
```
121+
122+
## Notes
123+
124+
These formatting rules do not make any consideration in terms of performances
125+
nor precision. The scope is limited to styling.

spec-0013/ecosystem_voting.jpg

-274 KB
Binary file not shown.

spec-0013/index.md

-38
This file was deleted.

0 commit comments

Comments
 (0)