Created
October 15, 2025 04:08
-
-
Save cppio/2fec748d8495e81203962450affdeb16 to your computer and use it in GitHub Desktop.
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
| def sig(fn): | |
| code = fn.__code__ | |
| defaults = fn.__defaults__ | |
| kwdefaults = fn.__kwdefaults__ | |
| if defaults is None: | |
| defaults = () | |
| if kwdefaults is None: | |
| kwdefaults = {} | |
| pos, varnames = code.co_varnames[:code.co_argcount], code.co_varnames[code.co_argcount:] | |
| pos_only, pos_or_kw = pos[:code.co_posonlyargcount], pos[code.co_posonlyargcount:] | |
| kw_only, varnames = varnames[:code.co_kwonlyargcount], varnames[code.co_kwonlyargcount:] | |
| if code.co_flags & 4: | |
| var_pos, varnames = varnames[0], varnames[1:] | |
| else: | |
| var_pos = None | |
| if code.co_flags & 8: | |
| var_kw = varnames[0] | |
| else: | |
| var_kw = None | |
| pieces = [] | |
| idx = len(defaults) - code.co_argcount | |
| for arg in pos_only: | |
| if idx >= 0: | |
| pieces.append(f"{arg}={defaults[idx]!r}") | |
| else: | |
| pieces.append(arg) | |
| idx += 1 | |
| if pos_only: | |
| pieces.append("/") | |
| for arg in pos_or_kw: | |
| if idx >= 0: | |
| pieces.append(f"{arg}={defaults[idx]!r}") | |
| else: | |
| pieces.append(arg) | |
| idx += 1 | |
| if var_pos is not None: | |
| pieces.append(f"*{var_pos}") | |
| elif kw_only: | |
| pieces.append("*") | |
| for kwarg in kw_only: | |
| if kwarg in kwdefaults: | |
| pieces.append(f"{kwarg}={kwdefaults[kwarg]!r}") | |
| else: | |
| pieces.append(kwarg) | |
| if var_kw is not None: | |
| pieces.append(f"**{var_kw}") | |
| return ", ".join(pieces) | |
| if __name__ == "__main__": | |
| import inspect | |
| tests = [ | |
| ", ".join([*pos_only, *pos_or_kw, *var_pos, *kw_only, *var_kw]) | |
| for var_kw in [[], ["**h"]] | |
| for kw_only in [[], ["f", "g"], ["f", "g='g'"], ["f='f'", "g"], ["f='f'", "g='g'"]] | |
| for var_pos in [["*"] if kw_only else [], ["*e"]] | |
| for pos_or_kw in [[], ["c", "d"], ["c", "d='d'"], ["c='c'", "d='d'"]] | |
| for pos_only in [[], ["a", "b", "/"], *([["a", "b='b'", "/"], ["a='a'", "b='b'", "/"]] if "c='c'" in pos_or_kw else [])] | |
| ] | |
| for test in tests: | |
| fn = eval(f"lambda {test}: ...") | |
| assert inspect.signature(fn).format() == f"({test})" | |
| assert sig(fn) == test |
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment