Skip to content

Commit 8db06f9

Browse files
committed
MAINT: make MyPy happy
1 parent 2334636 commit 8db06f9

File tree

6 files changed

+63
-57
lines changed

6 files changed

+63
-57
lines changed

src/qrules/_attrs.py

Lines changed: 17 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,17 @@
1+
from __future__ import annotations
2+
3+
from fractions import Fraction
4+
from typing import SupportsFloat
5+
6+
from qrules.quantum_numbers import Parity
7+
8+
9+
def to_fraction(value: SupportsFloat) -> Fraction:
10+
float_value = float(value)
11+
if float_value == -0.0:
12+
float_value = 0.0
13+
return Fraction(float_value)
14+
15+
16+
def to_parity(value: Parity | int) -> Parity:
17+
return Parity(value)

src/qrules/conservation_rules.py

Lines changed: 28 additions & 31 deletions
Original file line numberDiff line numberDiff line change
@@ -55,6 +55,7 @@
5555
from attrs import define, field, frozen
5656
from attrs.converters import optional
5757

58+
from qrules._attrs import to_fraction, to_parity
5859
from qrules.quantum_numbers import EdgeQuantumNumbers as EdgeQN
5960
from qrules.quantum_numbers import NodeQuantumNumbers as NodeQN
6061
from qrules.quantum_numbers import arange
@@ -186,9 +187,9 @@ def parity_conservation(
186187

187188
@frozen
188189
class HelicityParityEdgeInput:
189-
parity: EdgeQN.parity = field(converter=EdgeQN.parity)
190-
spin_magnitude: EdgeQN.spin_magnitude = field(converter=EdgeQN.spin_magnitude)
191-
spin_projection: EdgeQN.spin_projection = field(converter=EdgeQN.spin_projection)
190+
parity: EdgeQN.parity = field(converter=to_parity)
191+
spin_magnitude: EdgeQN.spin_magnitude = field(converter=to_fraction)
192+
spin_projection: EdgeQN.spin_projection = field(converter=to_fraction)
192193

193194

194195
def parity_conservation_helicity(
@@ -229,16 +230,18 @@ def parity_conservation_helicity(
229230

230231
@frozen
231232
class CParityEdgeInput:
232-
spin_magnitude: EdgeQN.spin_magnitude = field(converter=EdgeQN.spin_magnitude)
233-
pid: EdgeQN.pid = field(converter=EdgeQN.pid)
234-
c_parity: Optional[EdgeQN.c_parity] = field(converter=EdgeQN.c_parity, default=None)
233+
spin_magnitude: EdgeQN.spin_magnitude = field(converter=to_fraction)
234+
pid: EdgeQN.pid = field(converter=int)
235+
c_parity: Optional[EdgeQN.c_parity] = field(
236+
converter=optional(to_parity), default=None
237+
)
235238

236239

237240
@frozen
238241
class CParityNodeInput:
239242
# These converters currently do not do anything, as "NewType"s do not have constructors
240-
l_magnitude: NodeQN.l_magnitude = field(converter=NodeQN.l_magnitude)
241-
s_magnitude: NodeQN.s_magnitude = field(converter=NodeQN.s_magnitude)
243+
l_magnitude: NodeQN.l_magnitude = field(converter=to_fraction)
244+
s_magnitude: NodeQN.s_magnitude = field(converter=to_fraction)
242245

243246

244247
def c_parity_conservation(
@@ -284,18 +287,16 @@ def _get_c_parity_multiparticle(
284287

285288
@frozen
286289
class GParityEdgeInput:
287-
isospin_magnitude: EdgeQN.isospin_magnitude = field(
288-
converter=EdgeQN.isospin_magnitude
289-
)
290-
spin_magnitude: EdgeQN.spin_magnitude = field(converter=EdgeQN.spin_magnitude)
291-
pid: EdgeQN.pid = field(converter=EdgeQN.pid)
292-
g_parity: Optional[EdgeQN.g_parity] = field(converter=EdgeQN.g_parity, default=None)
290+
isospin_magnitude: EdgeQN.isospin_magnitude = field(converter=to_fraction)
291+
spin_magnitude: EdgeQN.spin_magnitude = field(converter=to_fraction)
292+
pid: EdgeQN.pid = field(converter=int)
293+
g_parity: Optional[EdgeQN.g_parity] = field(converter=to_parity, default=None)
293294

294295

295296
@frozen
296297
class GParityNodeInput:
297-
l_magnitude: NodeQN.l_magnitude = field(converter=NodeQN.l_magnitude)
298-
s_magnitude: NodeQN.s_magnitude = field(converter=NodeQN.s_magnitude)
298+
l_magnitude: NodeQN.l_magnitude = field(converter=to_fraction)
299+
s_magnitude: NodeQN.s_magnitude = field(converter=to_fraction)
299300

300301

301302
def g_parity_conservation( # noqa: C901
@@ -375,9 +376,9 @@ def check_g_parity_isobar(
375376

376377
@frozen
377378
class IdenticalParticleSymmetryOutEdgeInput:
378-
spin_magnitude: EdgeQN.spin_magnitude = field(converter=EdgeQN.spin_magnitude)
379-
spin_projection: EdgeQN.spin_projection = field(converter=EdgeQN.spin_projection)
380-
pid: EdgeQN.pid = field(converter=EdgeQN.pid)
379+
spin_magnitude: EdgeQN.spin_magnitude = field(converter=to_fraction)
380+
spin_projection: EdgeQN.spin_projection = field(converter=to_fraction)
381+
pid: EdgeQN.pid = field(converter=int)
381382

382383

383384
def identical_particle_symmetrization(
@@ -455,16 +456,16 @@ def _is_clebsch_gordan_coefficient_zero(
455456

456457
@frozen
457458
class SpinNodeInput:
458-
l_magnitude: NodeQN.l_magnitude = field(converter=NodeQN.l_magnitude)
459-
l_projection: NodeQN.l_projection = field(converter=NodeQN.l_projection)
460-
s_magnitude: NodeQN.s_magnitude = field(converter=NodeQN.s_magnitude)
461-
s_projection: NodeQN.s_projection = field(converter=NodeQN.s_projection)
459+
l_magnitude: NodeQN.l_magnitude = field(converter=to_fraction)
460+
l_projection: NodeQN.l_projection = field(converter=to_fraction)
461+
s_magnitude: NodeQN.s_magnitude = field(converter=to_fraction)
462+
s_projection: NodeQN.s_projection = field(converter=to_fraction)
462463

463464

464465
@frozen
465466
class SpinMagnitudeNodeInput:
466-
l_magnitude: NodeQN.l_magnitude = field(converter=NodeQN.l_magnitude)
467-
s_magnitude: NodeQN.s_magnitude = field(converter=NodeQN.s_magnitude)
467+
l_magnitude: NodeQN.l_magnitude = field(converter=to_fraction)
468+
s_magnitude: NodeQN.s_magnitude = field(converter=to_fraction)
468469

469470

470471
def ls_spin_validity(spin_input: SpinNodeInput) -> bool:
@@ -585,12 +586,8 @@ def __spin_couplings(spin1: _Spin, spin2: _Spin) -> set[_Spin]:
585586

586587
@define
587588
class IsoSpinEdgeInput:
588-
isospin_magnitude: EdgeQN.isospin_magnitude = field(
589-
converter=EdgeQN.isospin_magnitude
590-
)
591-
isospin_projection: EdgeQN.isospin_projection = field(
592-
converter=EdgeQN.isospin_projection
593-
)
589+
isospin_magnitude: EdgeQN.isospin_magnitude = field(converter=to_fraction)
590+
isospin_projection: EdgeQN.isospin_projection = field(converter=to_fraction)
594591

595592

596593
def _check_spin_valid(magnitude: Fraction, projection: Fraction) -> bool:

src/qrules/particle.py

Lines changed: 7 additions & 17 deletions
Original file line numberDiff line numberDiff line change
@@ -19,13 +19,14 @@
1919
from fractions import Fraction
2020
from functools import total_ordering
2121
from math import copysign
22-
from typing import TYPE_CHECKING, Any, Callable, SupportsFloat
22+
from typing import TYPE_CHECKING, Any, Callable
2323

2424
import attrs
2525
from attrs import field, frozen
2626
from attrs.converters import optional
2727
from attrs.validators import instance_of
2828

29+
from qrules._attrs import to_fraction, to_parity
2930
from qrules.conservation_rules import GellMannNishijimaInput, gellmann_nishijima
3031
from qrules.quantum_numbers import Parity, _float_as_signed_str
3132

@@ -44,13 +45,6 @@
4445
_LOGGER = logging.getLogger(__name__)
4546

4647

47-
def _to_fraction(value: SupportsFloat) -> Fraction:
48-
float_value = float(value)
49-
if float_value == -0.0:
50-
float_value = 0.0
51-
return Fraction(float_value)
52-
53-
5448
def _validate_fraction_for_spin(
5549
instance: Spin,
5650
attribute: Attribute, # noqa: ARG001
@@ -82,11 +76,11 @@ class Spin: # noqa: PLW1641
8276
"""Safe, immutable data container for spin **with projection**."""
8377

8478
magnitude: Fraction = field(
85-
converter=_to_fraction,
79+
converter=to_fraction,
8680
validator=_validate_fraction_for_spin,
8781
)
8882
projection: Fraction = field(
89-
converter=_to_fraction,
83+
converter=to_fraction,
9084
validator=_validate_fraction_for_spin,
9185
)
9286

@@ -125,10 +119,6 @@ def _render_fraction(fraction: Fraction, plusminus: bool = False) -> str:
125119
return str(fraction)
126120

127121

128-
def _to_parity(value: Parity | int) -> Parity:
129-
return Parity(int(value))
130-
131-
132122
def _to_spin(value: Spin | tuple[Fraction, Fraction] | tuple[float, float]) -> Spin:
133123
if isinstance(value, tuple):
134124
return Spin(*value)
@@ -173,9 +163,9 @@ class Particle:
173163
electron_lepton_number: int = field(default=0, validator=instance_of(int))
174164
muon_lepton_number: int = field(default=0, validator=instance_of(int))
175165
tau_lepton_number: int = field(default=0, validator=instance_of(int))
176-
parity: Parity | None = field(converter=optional(_to_parity), default=None)
177-
c_parity: Parity | None = field(converter=optional(_to_parity), default=None)
178-
g_parity: Parity | None = field(converter=optional(_to_parity), default=None)
166+
parity: Parity | None = field(converter=optional(to_parity), default=None)
167+
c_parity: Parity | None = field(converter=optional(to_parity), default=None)
168+
g_parity: Parity | None = field(converter=optional(to_parity), default=None)
179169

180170
def __attrs_post_init__(self) -> None:
181171
if self.isospin is not None and not gellmann_nishijima(

src/qrules/quantum_numbers.py

Lines changed: 4 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -20,7 +20,9 @@
2020
from collections.abc import Generator
2121

2222

23-
def _to_parity(value: int) -> Literal[-1, 1]:
23+
def _to_parity_int(value: int | Parity) -> Literal[-1, 1]:
24+
if isinstance(value, Parity):
25+
return value.value
2426
if not isinstance(value, int):
2527
msg = f"Parity must be an integer, not {type(value)}"
2628
raise TypeError(msg)
@@ -35,7 +37,7 @@ def _to_parity(value: int) -> Literal[-1, 1]:
3537
@total_ordering
3638
@frozen(eq=False, hash=True, order=False, repr=False)
3739
class Parity: # noqa: PLW1641
38-
value: Literal[-1, 1] = field(converter=_to_parity)
40+
value: Literal[-1, 1] = field(converter=_to_parity_int)
3941

4042
def __eq__(self, other: object) -> bool:
4143
if isinstance(other, Parity):

src/qrules/transition.py

Lines changed: 4 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -31,8 +31,8 @@
3131
Particle,
3232
ParticleCollection,
3333
ParticleWithSpin,
34-
_to_fraction,
3534
load_pdg,
35+
to_fraction,
3636
)
3737
from qrules.quantum_numbers import (
3838
EdgeQuantumNumber,
@@ -503,8 +503,8 @@ def create_edge_settings(edge_id: int) -> EdgeSettings:
503503
)
504504
_LOGGER.debug(
505505
"using %s interaction order for node: %s",
506-
str(interaction_types),
507-
str(node_id),
506+
interaction_types,
507+
node_id,
508508
)
509509

510510
temp_graph_settings: list[GraphSettings] = graph_settings
@@ -734,7 +734,7 @@ def _strip_spin(state_definition: Sequence[StateDefinition]) -> list[str]:
734734
@frozen(order=True)
735735
class State:
736736
particle: Particle = field(validator=instance_of(Particle))
737-
spin_projection: Fraction = field(converter=_to_fraction)
737+
spin_projection: Fraction = field(converter=to_fraction)
738738

739739

740740
StateTransition = FrozenTransition[State, InteractionProperties]

tests/unit/conservation_rules/test_helicity_conservation.py

Lines changed: 3 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -11,11 +11,11 @@
1111
[
1212
(
1313
[
14-
EdgeQuantumNumbers.spin_magnitude(s_magnitude),
14+
EdgeQuantumNumbers.spin_magnitude(s_magnitude), # type:ignore[arg-type]
1515
],
1616
[
17-
EdgeQuantumNumbers.spin_projection(lambda1),
18-
EdgeQuantumNumbers.spin_projection(lambda2),
17+
EdgeQuantumNumbers.spin_projection(lambda1), # type:ignore[arg-type]
18+
EdgeQuantumNumbers.spin_projection(lambda2), # type:ignore[arg-type]
1919
],
2020
abs(lambda1 - lambda2) <= s_magnitude,
2121
)

0 commit comments

Comments
 (0)