(*args: object, **kwargs: object)
| 248 | |
| 249 | @functools.wraps(func) |
| 250 | def wrapper(*args: object, **kwargs: object) -> object: |
| 251 | given_params: set[str] = set() |
| 252 | for i, _ in enumerate(args): |
| 253 | try: |
| 254 | given_params.add(positional[i]) |
| 255 | except IndexError: |
| 256 | raise TypeError( |
| 257 | f"{func.__name__}() takes {len(positional)} argument(s) but {len(args)} were given" |
| 258 | ) from None |
| 259 | |
| 260 | for key in kwargs.keys(): |
| 261 | given_params.add(key) |
| 262 | |
| 263 | for variant in variants: |
| 264 | matches = all((param in given_params for param in variant)) |
| 265 | if matches: |
| 266 | break |
| 267 | else: # no break |
| 268 | if len(variants) > 1: |
| 269 | variations = human_join( |
| 270 | ["(" + human_join([quote(arg) for arg in variant], final="and") + ")" for variant in variants] |
| 271 | ) |
| 272 | msg = f"Missing required arguments; Expected either {variations} arguments to be given" |
| 273 | else: |
| 274 | assert len(variants) > 0 |
| 275 | |
| 276 | # TODO: this error message is not deterministic |
| 277 | missing = list(set(variants[0]) - given_params) |
| 278 | if len(missing) > 1: |
| 279 | msg = f"Missing required arguments: {human_join([quote(arg) for arg in missing])}" |
| 280 | else: |
| 281 | msg = f"Missing required argument: {quote(missing[0])}" |
| 282 | raise TypeError(msg) |
| 283 | return func(*args, **kwargs) |
| 284 | |
| 285 | return wrapper # type: ignore |
| 286 |
nothing calls this directly
no test coverage detected