1
0
Fork 0
cursed-snakes/namespace-inject.py

46 lines
800 B
Python
Raw Normal View History

2023-04-03 16:50:34 +00:00
from types import FunctionType
2023-04-03 22:23:23 +00:00
from typing import Callable
2023-04-03 16:50:34 +00:00
2023-04-03 22:23:23 +00:00
def func1(pstr: str) -> None:
2023-04-03 16:50:34 +00:00
def foo() -> None:
print(f"{pstr = }")
foo()
2023-04-03 22:23:23 +00:00
def shoehorn(f: Callable) -> Callable:
code = f.__code__.replace(
co_nlocals=2,
co_varnames=("pstr", "foo"),
)
2023-04-03 16:50:34 +00:00
2023-04-03 22:23:23 +00:00
return FunctionType(
name=f.__name__,
code=code,
globals=func1.__globals__,
)
2023-04-03 16:50:34 +00:00
2023-04-03 22:23:23 +00:00
@shoehorn
def func2(pstr: str) -> None:
foo()
2023-04-03 16:50:34 +00:00
2023-04-03 22:23:23 +00:00
def func_info(f: Callable) -> None:
print(f"{f.__name__ } = {f}, {f.__code__.co_varnames = }")
f("bar")
f("baz")
2023-04-03 16:50:34 +00:00
2023-04-03 22:23:23 +00:00
if __name__ == "__main__":
func_info(func1)
func_info(func2)
2023-04-03 16:50:34 +00:00
import json
print(json.dumps({
2023-04-03 22:23:23 +00:00
name: repr(getattr(func2.__code__, name))
for name in dir(func2.__code__)
2023-04-03 16:50:34 +00:00
}, indent=2))