Skip to content

Commit 66b1fe3

Browse files
committed
MAINT: make MyPy happy
1 parent 2334636 commit 66b1fe3

File tree

6 files changed

+65
-62
lines changed

6 files changed

+65
-62
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: 29 additions & 30 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,18 @@ def _get_c_parity_multiparticle(
284287

285288
@frozen
286289
class GParityEdgeInput:
287-
isospin_magnitude: EdgeQN.isospin_magnitude = field(
288-
converter=EdgeQN.isospin_magnitude
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(
294+
converter=optional(to_parity), default=None
289295
)
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)
293296

294297

295298
@frozen
296299
class GParityNodeInput:
297-
l_magnitude: NodeQN.l_magnitude = field(converter=NodeQN.l_magnitude)
298-
s_magnitude: NodeQN.s_magnitude = field(converter=NodeQN.s_magnitude)
300+
l_magnitude: NodeQN.l_magnitude = field(converter=to_fraction)
301+
s_magnitude: NodeQN.s_magnitude = field(converter=to_fraction)
299302

300303

301304
def g_parity_conservation( # noqa: C901
@@ -375,9 +378,9 @@ def check_g_parity_isobar(
375378

376379
@frozen
377380
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)
381+
spin_magnitude: EdgeQN.spin_magnitude = field(converter=to_fraction)
382+
spin_projection: EdgeQN.spin_projection = field(converter=to_fraction)
383+
pid: EdgeQN.pid = field(converter=int)
381384

382385

383386
def identical_particle_symmetrization(
@@ -455,16 +458,16 @@ def _is_clebsch_gordan_coefficient_zero(
455458

456459
@frozen
457460
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)
461+
l_magnitude: NodeQN.l_magnitude = field(converter=to_fraction)
462+
l_projection: NodeQN.l_projection = field(converter=to_fraction)
463+
s_magnitude: NodeQN.s_magnitude = field(converter=to_fraction)
464+
s_projection: NodeQN.s_projection = field(converter=to_fraction)
462465

463466

464467
@frozen
465468
class SpinMagnitudeNodeInput:
466-
l_magnitude: NodeQN.l_magnitude = field(converter=NodeQN.l_magnitude)
467-
s_magnitude: NodeQN.s_magnitude = field(converter=NodeQN.s_magnitude)
469+
l_magnitude: NodeQN.l_magnitude = field(converter=to_fraction)
470+
s_magnitude: NodeQN.s_magnitude = field(converter=to_fraction)
468471

469472

470473
def ls_spin_validity(spin_input: SpinNodeInput) -> bool:
@@ -585,12 +588,8 @@ def __spin_couplings(spin1: _Spin, spin2: _Spin) -> set[_Spin]:
585588

586589
@define
587590
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-
)
591+
isospin_magnitude: EdgeQN.isospin_magnitude = field(converter=to_fraction)
592+
isospin_projection: EdgeQN.isospin_projection = field(converter=to_fraction)
594593

595594

596595
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: 5 additions & 10 deletions
Original file line numberDiff line numberDiff line change
@@ -16,6 +16,7 @@
1616
from attrs.validators import in_, instance_of
1717
from tqdm.auto import tqdm
1818

19+
from qrules._attrs import to_fraction
1920
from qrules._implementers import implement_pretty_repr
2021
from qrules.combinatorics import (
2122
InitialFacts,
@@ -27,13 +28,7 @@
2728
match_external_edges,
2829
permutate_topology_kinematically,
2930
)
30-
from qrules.particle import (
31-
Particle,
32-
ParticleCollection,
33-
ParticleWithSpin,
34-
_to_fraction,
35-
load_pdg,
36-
)
31+
from qrules.particle import Particle, ParticleCollection, ParticleWithSpin, load_pdg
3732
from qrules.quantum_numbers import (
3833
EdgeQuantumNumber,
3934
EdgeQuantumNumbers,
@@ -503,8 +498,8 @@ def create_edge_settings(edge_id: int) -> EdgeSettings:
503498
)
504499
_LOGGER.debug(
505500
"using %s interaction order for node: %s",
506-
str(interaction_types),
507-
str(node_id),
501+
interaction_types,
502+
node_id,
508503
)
509504

510505
temp_graph_settings: list[GraphSettings] = graph_settings
@@ -734,7 +729,7 @@ def _strip_spin(state_definition: Sequence[StateDefinition]) -> list[str]:
734729
@frozen(order=True)
735730
class State:
736731
particle: Particle = field(validator=instance_of(Particle))
737-
spin_projection: Fraction = field(converter=_to_fraction)
732+
spin_projection: Fraction = field(converter=to_fraction)
738733

739734

740735
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)