Skip to content

Commit cf95149

Browse files
hugovkjeromekelleher
authored andcommitted
Upgrade syntax for Python 3.10+
1 parent cd5b4a2 commit cf95149

7 files changed

Lines changed: 47 additions & 58 deletions

File tree

.pre-commit-config.yaml

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -20,10 +20,10 @@ repos:
2020
args: [--application-directories=python,
2121
--unclassifiable-application-module=_tskit]
2222
- repo: https://github.com/asottile/pyupgrade
23-
rev: v3.20.0
23+
rev: v3.21.2
2424
hooks:
2525
- id: pyupgrade
26-
args: [--py3-plus, --py38-plus]
26+
args: [--py310-plus]
2727
- repo: https://github.com/psf/black
2828
rev: 25.1.0
2929
hooks:

python/tests/test_ld_matrix.py

Lines changed: 28 additions & 32 deletions
Original file line numberDiff line numberDiff line change
@@ -24,17 +24,13 @@
2424
"""
2525
import contextlib
2626
import io
27+
from collections.abc import Callable
28+
from collections.abc import Generator
2729
from dataclasses import dataclass
2830
from itertools import combinations_with_replacement
2931
from itertools import permutations
3032
from itertools import product
3133
from typing import Any
32-
from typing import Callable
33-
from typing import Dict
34-
from typing import Generator
35-
from typing import List
36-
from typing import Tuple
37-
from typing import Union
3834

3935
import msprime
4036
import numpy as np
@@ -224,7 +220,7 @@ def norm_hap_weighted(
224220
n_a: int,
225221
n_b: int,
226222
result: np.ndarray,
227-
params: Dict[str, Any],
223+
params: dict[str, Any],
228224
) -> None:
229225
"""Create a vector of normalizing coefficients, length of the number of
230226
sample sets. In this normalization strategy, we weight each allele's
@@ -250,7 +246,7 @@ def norm_hap_weighted_ij(
250246
n_a: int,
251247
n_b: int,
252248
result: np.ndarray,
253-
params: Dict[str, Any],
249+
params: dict[str, Any],
254250
) -> None:
255251
"""
256252
Create a vector of normalizing coefficients, length of the number of
@@ -286,7 +282,7 @@ def norm_total_weighted(
286282
n_a: int,
287283
n_b: int,
288284
result: np.ndarray,
289-
params: Dict[str, Any],
285+
params: dict[str, Any],
290286
) -> None:
291287
"""Create a vector of normalizing coefficients, length of the number of
292288
sample sets. In this normalization strategy, we weight each allele's
@@ -332,7 +328,7 @@ def check_order_bounds_dups(values, max_value):
332328

333329
def get_site_row_col_indices(
334330
row_sites: np.ndarray, col_sites: np.ndarray
335-
) -> Tuple[List[int], List[int], List[int]]:
331+
) -> tuple[list[int], list[int], list[int]]:
336332
"""Co-iterate over the row and column sites, keeping a sorted union of
337333
site values and an index into the unique list of sites for both the row
338334
and column sites. This function produces a list of sites of interest and
@@ -448,8 +444,8 @@ def get_allele_samples(
448444

449445

450446
def get_mutation_samples(
451-
ts: tskit.TreeSequence, sites: List[int], sample_index_map: np.ndarray
452-
) -> Tuple[np.ndarray, np.ndarray, BitSet]:
447+
ts: tskit.TreeSequence, sites: list[int], sample_index_map: np.ndarray
448+
) -> tuple[np.ndarray, np.ndarray, BitSet]:
453449
"""For a given set of sites, generate a BitSet of all samples posessing
454450
each allelic state for each site. This includes the ancestral state, along
455451
with any mutations contained in the site.
@@ -507,8 +503,8 @@ def get_mutation_samples(
507503
return num_alleles, site_offsets, allele_samples
508504

509505

510-
SummaryFunc = Callable[[int, np.ndarray, int, np.ndarray, Dict[str, Any]], None]
511-
NormFunc = Callable[[int, np.ndarray, int, int, np.ndarray, Dict[str, Any]], None]
506+
SummaryFunc = Callable[[int, np.ndarray, int, np.ndarray, dict[str, Any]], None]
507+
NormFunc = Callable[[int, np.ndarray, int, int, np.ndarray, dict[str, Any]], None]
512508

513509

514510
def compute_general_two_site_stat_result(
@@ -523,7 +519,7 @@ def compute_general_two_site_stat_result(
523519
result_dim: int,
524520
func: SummaryFunc,
525521
norm_func: NormFunc,
526-
params: Dict[str, Any],
522+
params: dict[str, Any],
527523
polarised: bool,
528524
result: np.ndarray,
529525
) -> None:
@@ -777,8 +773,8 @@ def two_branch_count_stat(
777773

778774

779775
def sample_sets_to_bit_array(
780-
ts: tskit.TreeSequence, sample_sets: Union[List[List[int]], List[np.ndarray]]
781-
) -> Tuple[np.ndarray, np.ndarray, BitSet]:
776+
ts: tskit.TreeSequence, sample_sets: list[list[int]] | list[np.ndarray]
777+
) -> tuple[np.ndarray, np.ndarray, BitSet]:
782778
"""Convert the list of sample ids to a bit array. This function takes
783779
sample identifiers and maps them to their enumerated integer values, then
784780
stores these values in a bit array. We produce a BitArray and a numpy
@@ -994,7 +990,7 @@ def r2_summary_func(
994990
state: np.ndarray,
995991
result_dim: int,
996992
result: np.ndarray,
997-
params: Dict[str, Any],
993+
params: dict[str, Any],
998994
) -> None:
999995
"""Summary function for the r2 statistic. We first compute the proportion of
1000996
AB, A, and B haplotypes, then we compute the r2 statistic, storing the outputs
@@ -1028,7 +1024,7 @@ def r2_ij_summary_func(
10281024
state: np.ndarray,
10291025
result_dim: int,
10301026
result: np.ndarray,
1031-
params: Dict[str, Any],
1027+
params: dict[str, Any],
10321028
) -> None:
10331029
sample_set_sizes = params["sample_set_sizes"]
10341030
set_indexes = params["set_indexes"]
@@ -1062,7 +1058,7 @@ def D_summary_func(
10621058
state: np.ndarray,
10631059
result_dim: int,
10641060
result: np.ndarray,
1065-
params: Dict[str, Any],
1061+
params: dict[str, Any],
10661062
) -> None:
10671063
sample_set_sizes = params["sample_set_sizes"]
10681064
for k in range(state_dim):
@@ -1082,7 +1078,7 @@ def D2_summary_func(
10821078
state: np.ndarray,
10831079
result_dim: int,
10841080
result: np.ndarray,
1085-
params: Dict[str, Any],
1081+
params: dict[str, Any],
10861082
) -> None:
10871083
sample_set_sizes = params["sample_set_sizes"]
10881084
for k in range(state_dim):
@@ -1103,7 +1099,7 @@ def D_prime_summary_func(
11031099
state: np.ndarray,
11041100
result_dim: int,
11051101
result: np.ndarray,
1106-
params: Dict[str, Any],
1102+
params: dict[str, Any],
11071103
) -> None:
11081104
sample_set_sizes = params["sample_set_sizes"]
11091105
for k in range(state_dim):
@@ -1128,7 +1124,7 @@ def r_summary_func(
11281124
state: np.ndarray,
11291125
result_dim: int,
11301126
result: np.ndarray,
1131-
params: Dict[str, Any],
1127+
params: dict[str, Any],
11321128
) -> None:
11331129
sample_set_sizes = params["sample_set_sizes"]
11341130
for k in range(state_dim):
@@ -1152,7 +1148,7 @@ def Dz_summary_func(
11521148
state: np.ndarray,
11531149
result_dim: int,
11541150
result: np.ndarray,
1155-
params: Dict[str, Any],
1151+
params: dict[str, Any],
11561152
) -> None:
11571153
sample_set_sizes = params["sample_set_sizes"]
11581154
for k in range(state_dim):
@@ -1174,7 +1170,7 @@ def pi2_summary_func(
11741170
state: np.ndarray,
11751171
result_dim: int,
11761172
result: np.ndarray,
1177-
params: Dict[str, Any],
1173+
params: dict[str, Any],
11781174
) -> None:
11791175
sample_set_sizes = params["sample_set_sizes"]
11801176
for k in range(state_dim):
@@ -1205,7 +1201,7 @@ def pi2_unbiased_summary_func(
12051201
state: np.ndarray,
12061202
result_dim: int,
12071203
result: np.ndarray,
1208-
params: Dict[str, Any],
1204+
params: dict[str, Any],
12091205
):
12101206
sample_set_sizes = params["sample_set_sizes"]
12111207
for k in range(state_dim):
@@ -1227,7 +1223,7 @@ def Dz_unbiased_summary_func(
12271223
state: np.ndarray,
12281224
result_dim: int,
12291225
result: np.ndarray,
1230-
params: Dict[str, Any],
1226+
params: dict[str, Any],
12311227
):
12321228
sample_set_sizes = params["sample_set_sizes"]
12331229
for k in range(state_dim):
@@ -1253,7 +1249,7 @@ def D2_unbiased_summary_func(
12531249
state: np.ndarray,
12541250
result_dim: int,
12551251
result: np.ndarray,
1256-
params: Dict[str, Any],
1252+
params: dict[str, Any],
12571253
):
12581254
sample_set_sizes = params["sample_set_sizes"]
12591255
for k in range(state_dim):
@@ -1275,7 +1271,7 @@ def D2_ij_summary_func(
12751271
state: np.ndarray,
12761272
result_dim: int,
12771273
result: np.ndarray,
1278-
params: Dict[str, Any],
1274+
params: dict[str, Any],
12791275
):
12801276
sample_set_sizes = params["sample_set_sizes"]
12811277
set_indexes = params["set_indexes"]
@@ -1307,7 +1303,7 @@ def D2_ij_unbiased_summary_func(
13071303
state: np.ndarray,
13081304
result_dim: int,
13091305
result: np.ndarray,
1310-
params: Dict[str, Any],
1306+
params: dict[str, Any],
13111307
):
13121308
sample_set_sizes = params["sample_set_sizes"]
13131309
set_indexes = params["set_indexes"]
@@ -1831,8 +1827,8 @@ class TreeState:
18311827
# 0 1
18321828
# 1 0
18331829
# 1 1
1834-
edges_out: List[int] # list of edges removed during iteration
1835-
edges_in: List[int] # list of edges added during iteration
1830+
edges_out: list[int] # list of edges removed during iteration
1831+
edges_in: list[int] # list of edges added during iteration
18361832

18371833
def __init__(self, ts, sample_sets, num_sample_sets, sample_index_map):
18381834
self.pos = tsutil.TreeIndexes(ts)

python/tests/tsutil.py

Lines changed: 2 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -30,7 +30,6 @@
3030
import random
3131
import string
3232
import struct
33-
import typing
3433

3534
import msprime
3635
import numpy as np
@@ -1718,7 +1717,7 @@ def __iter__(self):
17181717
class EdgeRange:
17191718
start: int
17201719
stop: int
1721-
order: typing.List
1720+
order: list
17221721

17231722

17241723
class TreeIndexes:
@@ -2164,7 +2163,7 @@ def metadata_map(tables):
21642163
return out
21652164

21662165

2167-
@functools.lru_cache(maxsize=None)
2166+
@functools.cache
21682167
def all_trees_ts(n):
21692168
"""
21702169
Generate a tree sequence that corresponds to the lexicographic listing

python/tskit/drawing.py

Lines changed: 2 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -31,10 +31,8 @@
3131
import operator
3232
import warnings
3333
import xml.dom.minidom
34+
from collections.abc import Mapping
3435
from dataclasses import dataclass
35-
from typing import List
36-
from typing import Mapping
37-
from typing import Union
3836

3937
import numpy as np
4038

@@ -538,7 +536,7 @@ def clip_ts(ts, x_min, x_max, max_num_trees=None):
538536
return ts, tree_status, offsets
539537

540538

541-
def check_y_ticks(ticks: Union[List, Mapping, None]) -> Mapping:
539+
def check_y_ticks(ticks: list | Mapping | None) -> Mapping:
542540
"""
543541
Later we might want to implement a tick locator function, such that e.g. ticks=5
544542
selects ~5 nicely spaced tick locations (with sensible behaviour for log scales)

python/tskit/metadata.py

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -33,9 +33,9 @@
3333
import pprint
3434
import struct
3535
import types
36+
from collections.abc import Mapping
3637
from itertools import islice
3738
from typing import Any
38-
from typing import Mapping
3939

4040
import jsonschema
4141
import numpy as np

python/tskit/tables.py

Lines changed: 9 additions & 12 deletions
Original file line numberDiff line numberDiff line change
@@ -32,9 +32,6 @@
3232
import operator
3333
import warnings
3434
from dataclasses import dataclass
35-
from typing import Dict
36-
from typing import Optional
37-
from typing import Union
3835

3936
import numpy as np
4037

@@ -84,7 +81,7 @@ class IndividualTableRow(util.Dataclass):
8481
"""
8582
See :attr:`Individual.parents`
8683
"""
87-
metadata: Optional[Union[bytes, dict]]
84+
metadata: bytes | dict | None
8885
"""
8986
See :attr:`Individual.metadata`
9087
"""
@@ -124,7 +121,7 @@ class NodeTableRow(util.Dataclass):
124121
"""
125122
See :attr:`Node.individual`
126123
"""
127-
metadata: Optional[Union[bytes, dict]]
124+
metadata: bytes | dict | None
128125
"""
129126
See :attr:`Node.metadata`
130127
"""
@@ -154,7 +151,7 @@ class EdgeTableRow(util.Dataclass):
154151
"""
155152
See :attr:`Edge.child`
156153
"""
157-
metadata: Optional[Union[bytes, dict]]
154+
metadata: bytes | dict | None
158155
"""
159156
See :attr:`Edge.metadata`
160157
"""
@@ -192,7 +189,7 @@ class MigrationTableRow(util.Dataclass):
192189
"""
193190
See :attr:`Migration.time`
194191
"""
195-
metadata: Optional[Union[bytes, dict]]
192+
metadata: bytes | dict | None
196193
"""
197194
See :attr:`Migration.metadata`
198195
"""
@@ -214,7 +211,7 @@ class SiteTableRow(util.Dataclass):
214211
"""
215212
See :attr:`Site.ancestral_state`
216213
"""
217-
metadata: Optional[Union[bytes, dict]]
214+
metadata: bytes | dict | None
218215
"""
219216
See :attr:`Site.metadata`
220217
"""
@@ -244,7 +241,7 @@ class MutationTableRow(util.Dataclass):
244241
"""
245242
See :attr:`Mutation.parent`
246243
"""
247-
metadata: Optional[Union[bytes, dict]]
244+
metadata: bytes | dict | None
248245
"""
249246
See :attr:`Mutation.metadata`
250247
"""
@@ -279,7 +276,7 @@ class PopulationTableRow(util.Dataclass):
279276
"""
280277

281278
__slots__ = ["metadata"]
282-
metadata: Optional[Union[bytes, dict]]
279+
metadata: bytes | dict | None
283280
"""
284281
See :attr:`Population.metadata`
285282
"""
@@ -3247,7 +3244,7 @@ def asdict(self, force_offset_64=False):
32473244
return self._ll_tables.asdict(force_offset_64)
32483245

32493246
@property
3250-
def table_name_map(self) -> Dict:
3247+
def table_name_map(self) -> dict:
32513248
"""
32523249
Returns a dictionary mapping table names to the corresponding
32533250
table instances. For example, the returned dictionary will contain the
@@ -3265,7 +3262,7 @@ def table_name_map(self) -> Dict:
32653262
}
32663263

32673264
@property
3268-
def name_map(self) -> Dict:
3265+
def name_map(self) -> dict:
32693266
# Deprecated in 0.4.1
32703267
warnings.warn(
32713268
"name_map is deprecated; use table_name_map instead",

0 commit comments

Comments
 (0)