Skip to content

Instantly share code, notes, and snippets.

@jakelevi1996
Last active October 1, 2024 15:04
Show Gist options
  • Select an option

  • Save jakelevi1996/f63006521d17153c6e49d5ec5e6f4c97 to your computer and use it in GitHub Desktop.

Select an option

Save jakelevi1996/f63006521d17153c6e49d5ec5e6f4c97 to your computer and use it in GitHub Desktop.

Revisions

  1. jakelevi1996 revised this gist Oct 1, 2024. 1 changed file with 7 additions and 6 deletions.
    13 changes: 7 additions & 6 deletions change_function_signature.py
    Original file line number Diff line number Diff line change
    @@ -1,12 +1,13 @@
    import inspect

    def f1(a1: int, k1="v1", k2="v2"):
    def f1(a1: int, k1: str="v1", k2: str="v2") -> None:
    print("f1", a1, k1, k2)

    def f2(a2):
    def f2(a2: int) -> int:
    print("f2", a2)
    return a2 + 1

    def f3(a3, **kwargs):
    def f3(a3: int, **kwargs: str) -> None:
    f1((f2(a3)), **kwargs)

    new_params = [
    @@ -22,9 +23,9 @@ def f3(a3, **kwargs):
    new_signature = inspect.signature(f3).replace(parameters=new_params)

    print(inspect.signature(f1))
    # (a1: int, k1='v1', k2='v2')
    # (a1: int, k1: str = 'v1', k2: str = 'v2') -> None
    print(inspect.signature(f3))
    # (a3, **kwargs)
    # (a3: int, **kwargs: str) -> None
    f3.__signature__ = new_signature
    print(inspect.signature(f3))
    # (a3, k1='v1', k2='v2')
    # (a3: int, k1: str = 'v1', k2: str = 'v2') -> None
  2. jakelevi1996 created this gist Sep 30, 2024.
    30 changes: 30 additions & 0 deletions change_function_signature.py
    Original file line number Diff line number Diff line change
    @@ -0,0 +1,30 @@
    import inspect

    def f1(a1: int, k1="v1", k2="v2"):
    print("f1", a1, k1, k2)

    def f2(a2):
    print("f2", a2)

    def f3(a3, **kwargs):
    f1((f2(a3)), **kwargs)

    new_params = [
    *[
    p for p in inspect.signature(f3).parameters.values()
    if p.kind is not p.VAR_KEYWORD
    ],
    *[
    p for p in inspect.signature(f1).parameters.values()
    if p.default is not inspect.Parameter.empty
    ],
    ]
    new_signature = inspect.signature(f3).replace(parameters=new_params)

    print(inspect.signature(f1))
    # (a1: int, k1='v1', k2='v2')
    print(inspect.signature(f3))
    # (a3, **kwargs)
    f3.__signature__ = new_signature
    print(inspect.signature(f3))
    # (a3, k1='v1', k2='v2')