Skip to content

Commit 8fcee7b

Browse files
authored
feat: new simpler Python 3.6+ family usage (#513)
* feat: new simpler Python 3.6+ family usage * docs: changelog update
1 parent f00108b commit 8fcee7b

File tree

11 files changed

+100
-96
lines changed

11 files changed

+100
-96
lines changed

docs/CHANGELOG.md

Lines changed: 10 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -3,10 +3,20 @@
33
## Version 1.0
44

55
Dropped support for Python 2 and 3.5; removed large numbers of workarounds.
6+
Subclassing histogram components now uses Python 3 class keyword syntax to set
7+
families.
68

9+
#### User changes
10+
11+
* Dropped Python 2.7 and 3.5 support [#512][]
712
* Removed deprecated `.options` from axes. Use `.traits` instead. [#503][]
13+
* Use keyword class family setting when subclassing histogram components
14+
instead of custom decorator. [#513][]
815

916
[#503]: https://github.com/scikit-hep/boost-histogram/pull/503
17+
[#512]: https://github.com/scikit-hep/boost-histogram/pull/512
18+
[#513]: https://github.com/scikit-hep/boost-histogram/pull/513
19+
1020

1121
## Version 0.13
1222

src/boost_histogram/__init__.py

Lines changed: 1 addition & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -1,4 +1,4 @@
1-
from . import accumulators, axis, numpy, storage, utils
1+
from . import accumulators, axis, numpy, storage
22
from ._internal.enum import Kind
33
from ._internal.hist import Histogram
44
from .tag import loc, overflow, rebin, sum, underflow
@@ -24,7 +24,6 @@
2424
"axis",
2525
"storage",
2626
"accumulators",
27-
"utils",
2827
"numpy",
2928
"loc",
3029
"rebin",

src/boost_histogram/_internal/axis.py

Lines changed: 17 additions & 16 deletions
Original file line numberDiff line numberDiff line change
@@ -1,10 +1,12 @@
11
import copy
2-
from typing import Any, Dict, Optional, Tuple, Union
2+
from typing import Any, Dict, Optional, Set, Tuple, Union
3+
4+
import boost_histogram
35

46
from .._core import axis as ca
57
from .axis_transform import AxisTransform
68
from .traits import Traits
7-
from .utils import MAIN_FAMILY, cast, register, set_family, set_module
9+
from .utils import cast, register, set_module
810

911

1012
def _isstr(value: Any) -> bool:
@@ -20,14 +22,19 @@ def _isstr(value: Any) -> bool:
2022
return False
2123

2224

23-
def opts(**kwargs: bool):
25+
def opts(**kwargs: bool) -> Set[str]:
2426
return {k for k, v in kwargs.items() if v}
2527

2628

2729
# Contains common methods and properties to all axes
2830
@set_module("boost_histogram.axis")
2931
class Axis:
3032
__slots__ = ("_ax", "__dict__")
33+
_family: object
34+
35+
def __init_subclass__(cls, *, family: object) -> None:
36+
super().__init_subclass__()
37+
cls._family = family
3138

3239
def __setattr__(self, attr: str, value: Any) -> None:
3340
if attr == "__dict__":
@@ -244,8 +251,7 @@ def widths(self):
244251
}
245252
)
246253
@set_module("boost_histogram.axis")
247-
@set_family(MAIN_FAMILY)
248-
class Regular(Axis):
254+
class Regular(Axis, family=boost_histogram):
249255
__slots__ = ()
250256

251257
def __init__(
@@ -361,9 +367,8 @@ def transform(self) -> Optional[AxisTransform]:
361367
ca.variable_circular,
362368
}
363369
)
364-
@set_family(MAIN_FAMILY)
365370
@set_module("boost_histogram.axis")
366-
class Variable(Axis):
371+
class Variable(Axis, family=boost_histogram):
367372
__slots__ = ()
368373

369374
def __init__(
@@ -444,9 +449,8 @@ def _repr_args(self) -> str:
444449
ca.integer_circular,
445450
}
446451
)
447-
@set_family(MAIN_FAMILY)
448452
@set_module("boost_histogram.axis")
449-
class Integer(Axis):
453+
class Integer(Axis, family=boost_histogram):
450454
__slots__ = ()
451455

452456
def __init__(
@@ -514,7 +518,7 @@ def _repr_args(self):
514518
return "{start:g}, {stop:g}".format(start=self.edges[0], stop=self.edges[-1])
515519

516520

517-
class BaseCategory(Axis):
521+
class BaseCategory(Axis, family=boost_histogram):
518522
__slots__ = ()
519523

520524
def _repr_kwargs(self):
@@ -536,10 +540,9 @@ def _repr_kwargs(self):
536540
return ret
537541

538542

539-
@set_family(MAIN_FAMILY)
540543
@set_module("boost_histogram.axis")
541544
@register({ca.category_str_growth, ca.category_str})
542-
class StrCategory(BaseCategory):
545+
class StrCategory(BaseCategory, family=boost_histogram):
543546
__slots__ = ()
544547

545548
def __init__(
@@ -603,10 +606,9 @@ def _repr_args(self):
603606
return "[{}]".format(", ".join(repr(c) for c in self))
604607

605608

606-
@set_family(MAIN_FAMILY)
607609
@set_module("boost_histogram.axis")
608610
@register({ca.category_int, ca.category_int_growth})
609-
class IntCategory(BaseCategory):
611+
class IntCategory(BaseCategory, family=boost_histogram):
610612
__slots__ = ()
611613

612614
def __init__(
@@ -655,9 +657,8 @@ def _repr_args(self) -> str:
655657

656658
# Contains all common methods and properties for the boolean axis
657659
@register({ca.boolean})
658-
@set_family(MAIN_FAMILY)
659660
@set_module("boost_histogram.axis")
660-
class Boolean(Axis):
661+
class Boolean(Axis, family=boost_histogram):
661662
__slots__ = ()
662663

663664
def __init__(self, *, metadata: Any = None, __dict__: Dict[str, Any] = None):

src/boost_histogram/_internal/axis_transform.py

Lines changed: 13 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -1,13 +1,20 @@
11
import copy
22
from typing import Any
33

4+
import boost_histogram
5+
46
from .._core import axis as ca
5-
from .utils import MAIN_FAMILY, register, set_family, set_module
7+
from .utils import register, set_module
68

79

810
@set_module("boost_histogram.axis.transform")
911
class AxisTransform:
1012
__slots__ = ("_this",)
13+
_family: object
14+
15+
def __init_subclass__(cls, *, family: object) -> None:
16+
super().__init_subclass__()
17+
cls._family = family
1118

1219
def __copy__(self):
1320
other = self.__class__.__new__(self.__class__)
@@ -33,7 +40,7 @@ def _produce(self, bins: int, start: int, stop: int) -> Any:
3340

3441
def __init__(self) -> None:
3542
"Create a new transform instance"
36-
# Note: this comes from set_family
43+
# Note: this comes from family
3744
(cpp_class,) = self._types # type: ignore
3845
self._this = cpp_class()
3946

@@ -49,16 +56,15 @@ def inverse(self, value):
4956
core = "__init__ forward inverse".split()
5057

5158

52-
@set_family(MAIN_FAMILY)
5359
@set_module("boost_histogram.axis.transform")
5460
@register({ca.transform.pow})
55-
class Pow(AxisTransform):
61+
class Pow(AxisTransform, family=boost_histogram):
5662
__slots__ = ()
5763
_type = ca.regular_pow
5864

5965
def __init__(self, power: float):
6066
"Create a new transform instance"
61-
# Note: this comes from set_family
67+
# Note: this comes from family
6268
(cpp_class,) = self._types # type: ignore
6369
self._this = cpp_class(power)
6470

@@ -72,10 +78,9 @@ def _produce(self, bins, start, stop):
7278
return self.__class__._type(bins, start, stop, self.power)
7379

7480

75-
@set_family(MAIN_FAMILY)
7681
@set_module("boost_histogram.axis.transform")
7782
@register({ca.transform.func_transform})
78-
class Function(AxisTransform):
83+
class Function(AxisTransform, family=boost_histogram):
7984
__slots__ = ()
8085
_type = ca.regular_trans
8186

@@ -126,7 +131,7 @@ def log(x):
126131
127132
"""
128133

129-
# Note: this comes from set_family
134+
# Note: this comes from family
130135
(cpp_class,) = self._types # type: ignore
131136
self._this = cpp_class(forward, inverse, convert, name)
132137

src/boost_histogram/_internal/hist.py

Lines changed: 9 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -6,12 +6,14 @@
66

77
import numpy as np
88

9+
import boost_histogram
10+
911
from .. import _core
1012
from .axestuple import AxesTuple
1113
from .axis import Axis
1214
from .enum import Kind
1315
from .storage import Double, Storage
14-
from .utils import MAIN_FAMILY, cast, register, set_family, set_module
16+
from .utils import cast, register, set_module
1517
from .view import _to_view
1618

1719
if TYPE_CHECKING:
@@ -83,7 +85,6 @@ def _expand_ellipsis(indexes, rank):
8385
# We currently do not cast *to* a histogram, but this is consistent
8486
# and could be used later.
8587
@register(_histograms)
86-
@set_family(MAIN_FAMILY)
8788
@set_module("boost_histogram")
8889
class Histogram:
8990
# Note this is a __slots__ __dict__ class!
@@ -94,6 +95,12 @@ class Histogram:
9495
)
9596
# .metadata and ._variance_known are part of the dict
9697

98+
_family: object = boost_histogram
99+
100+
def __init_subclass__(cls, *, family: object) -> None:
101+
super().__init_subclass__()
102+
cls._family = family
103+
97104
def __init__(
98105
self,
99106
*axes: Axis,
Lines changed: 16 additions & 18 deletions
Original file line numberDiff line numberDiff line change
@@ -1,53 +1,51 @@
1+
import boost_histogram
2+
13
from .._core import storage as store
2-
from .utils import MAIN_FAMILY, set_family, set_module
4+
from .utils import set_module
35

46

57
# Simple mixin to provide a common base class for types
68
class Storage:
7-
def __repr__(self):
8-
return f"{self.__class__.__name__}()"
9+
_family: object
910

11+
def __init_subclass__(cls, *, family: object) -> None:
12+
super().__init_subclass__()
13+
cls._family = family
1014

11-
# MAIN FAMILY
15+
def __repr__(self):
16+
return f"{self.__class__.__name__}()"
1217

1318

14-
@set_family(MAIN_FAMILY)
1519
@set_module("boost_histogram.storage")
16-
class Int64(store.int64, Storage):
20+
class Int64(store.int64, Storage, family=boost_histogram):
1721
pass
1822

1923

20-
@set_family(MAIN_FAMILY)
2124
@set_module("boost_histogram.storage")
22-
class Double(store.double, Storage):
25+
class Double(store.double, Storage, family=boost_histogram):
2326
pass
2427

2528

26-
@set_family(MAIN_FAMILY)
2729
@set_module("boost_histogram.storage")
28-
class AtomicInt64(store.atomic_int64, Storage):
30+
class AtomicInt64(store.atomic_int64, Storage, family=boost_histogram):
2931
pass
3032

3133

32-
@set_family(MAIN_FAMILY)
3334
@set_module("boost_histogram.storage")
34-
class Unlimited(store.unlimited, Storage):
35+
class Unlimited(store.unlimited, Storage, family=boost_histogram):
3536
pass
3637

3738

38-
@set_family(MAIN_FAMILY)
3939
@set_module("boost_histogram.storage")
40-
class Weight(store.weight, Storage):
40+
class Weight(store.weight, Storage, family=boost_histogram):
4141
pass
4242

4343

44-
@set_family(MAIN_FAMILY)
4544
@set_module("boost_histogram.storage")
46-
class Mean(store.mean, Storage):
45+
class Mean(store.mean, Storage, family=boost_histogram):
4746
pass
4847

4948

50-
@set_family(MAIN_FAMILY)
5149
@set_module("boost_histogram.storage")
52-
class WeightedMean(store.weighted_mean, Storage):
50+
class WeightedMean(store.weighted_mean, Storage, family=boost_histogram):
5351
pass

0 commit comments

Comments
 (0)