4
4
5
5
from __future__ import annotations
6
6
7
+ import functools
7
8
import operator
8
9
import os
9
10
import platform
@@ -202,13 +203,14 @@ def _normalize(*values: str, key: str) -> tuple[str, ...]:
202
203
203
204
204
205
def _evaluate_markers (markers : MarkerList , environment : dict [str , str ]) -> bool :
205
- groups : list [list [bool ]] = [[]]
206
+ # Lazy evaluation to mitigate https://github.com/pypa/packaging/issues/774
207
+ groups : list [list [Callable [[], bool ]]] = [[]]
206
208
207
209
for marker in markers :
208
210
assert isinstance (marker , (list , tuple , str ))
209
211
210
212
if isinstance (marker , list ):
211
- groups [- 1 ].append (_evaluate_markers ( marker , environment ))
213
+ groups [- 1 ].append (functools . partial ( _evaluate_markers , marker , environment ))
212
214
elif isinstance (marker , tuple ):
213
215
lhs , op , rhs = marker
214
216
@@ -222,13 +224,13 @@ def _evaluate_markers(markers: MarkerList, environment: dict[str, str]) -> bool:
222
224
rhs_value = environment [environment_key ]
223
225
224
226
lhs_value , rhs_value = _normalize (lhs_value , rhs_value , key = environment_key )
225
- groups [- 1 ].append (_eval_op ( lhs_value , op , rhs_value ))
227
+ groups [- 1 ].append (functools . partial ( _eval_op , lhs_value , op , rhs_value ))
226
228
else :
227
229
assert marker in ["and" , "or" ]
228
230
if marker == "or" :
229
231
groups .append ([])
230
232
231
- return any (all (item ) for item in groups )
233
+ return any (all (expr ( ) for expr in group ) for group in groups )
232
234
233
235
234
236
def format_full_version (info : sys ._version_info ) -> str :
0 commit comments