| 12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455565758596061 |
- # Part of ImGui Bundle - MIT License - Copyright (c) 2022-2026 Pascal Thomet - https://github.com/pthom/imgui_bundle
- from typing import Callable, TypeVar, Any
- # Create type variables for the argument and return types of the function
- A = TypeVar("A", bound=Callable[..., Any])
- def static(**kwargs: Any) -> Callable[[A], A]:
- """A decorator that adds static variables to a function
- :param kwargs: list of static variables to add
- :return: decorated function
- Example:
- @static(x=0, y=0)
- def my_function():
- # static vars are stored as attributes of "my_function"
- # we use static as a more readable synonym.
- static = my_function
- static.x += 1
- static.y += 2
- print(f"{static.f.x}, {static.f.x}")
- invoking f three times would print 1, 2 then 2, 4, then 3, 6
- Static variables are similar to global variables, with the same shortcomings!
- Use them only in small scripts, not in production code!
- """
- def decorator(func: A) -> A:
- for key, value in kwargs.items():
- setattr(func, key, value)
- return func
- return decorator
- def run_anon_block(function: Callable[[], None]) -> None:
- """Decorator for anonymous block
- This enables you to emulate CC++ anonymous blocks.
- In the example below, _win_code() is an anonymous block which is evaluated right after its definition.
- Its presence makes it possible to indent parts of the code (for example, the code responsible for the widgets
- inside a window)
- imgui.begin("My window")
- @run_anon_block
- def _win_code():
- imgui.text("What is your name")
- changed_f, first_name = imgui.input_text("First name")
- changed_l, last_name = imgui.input_text("Last name")
- # ...
- imgui.end()
- """
- function()
- # Create type variables for the argument and return types of the function
- AnyCallable = TypeVar("AnyCallable", bound=Callable[..., Any])
|