44
55from __future__ import annotations
66
7+ import functools
78import operator
89import os
910import platform
@@ -202,13 +203,14 @@ def _normalize(*values: str, key: str) -> tuple[str, ...]:
202203
203204
204205def _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 ]]] = [[]]
206208
207209 for marker in markers :
208210 assert isinstance (marker , (list , tuple , str ))
209211
210212 if isinstance (marker , list ):
211- groups [- 1 ].append (_evaluate_markers ( marker , environment ))
213+ groups [- 1 ].append (functools . partial ( _evaluate_markers , marker , environment ))
212214 elif isinstance (marker , tuple ):
213215 lhs , op , rhs = marker
214216
@@ -222,13 +224,13 @@ def _evaluate_markers(markers: MarkerList, environment: dict[str, str]) -> bool:
222224 rhs_value = environment [environment_key ]
223225
224226 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 ))
226228 else :
227229 assert marker in ["and" , "or" ]
228230 if marker == "or" :
229231 groups .append ([])
230232
231- return any (all (item ) for item in groups )
233+ return any (all (expr ( ) for expr in group ) for group in groups )
232234
233235
234236def format_full_version (info : sys ._version_info ) -> str :
0 commit comments