| 37 | |
| 38 | |
| 39 | def instantiate(callable, config, unused_keys=(), **kwargs): |
| 40 | merged = {**config, **kwargs} |
| 41 | signature = inspect.signature(callable) |
| 42 | for name, param in signature.parameters.items(): |
| 43 | if param.kind in (inspect.Parameter.POSITIONAL_ONLY, inspect.Parameter.VAR_POSITIONAL): |
| 44 | raise ValueError('Unsupported kind for param {}: {}'.format(name, param.kind)) |
| 45 | |
| 46 | if any(param.kind == inspect.Parameter.VAR_KEYWORD for param in signature.parameters.values()): |
| 47 | return callable(**merged) |
| 48 | |
| 49 | missing = {} |
| 50 | for key in list(merged.keys()): |
| 51 | if key not in signature.parameters: |
| 52 | if key not in unused_keys: |
| 53 | missing[key] = merged[key] |
| 54 | merged.pop(key) |
| 55 | if missing: |
| 56 | print('WARNING {}: superfluous {}'.format(callable, missing), file=sys.stderr) |
| 57 | return callable(**merged) |