Для этой статьи я просто собираюсь провести некоторое время в Shell Python. Пожалуйста, дайте мне знать, если это полезно или ужасно 😄.
>>> import inspect >>> # Let's learn a little about the inspect module >>> inspect.__doc__.splitlines()[0] 'Get useful information from live Python objects.' >>> inspect.signature.__doc__ 'Get a signature object for the passed callable.' >>> inspect.Signature.__doc__.splitlines()[0] 'A Signature object represents the overall signature of a function.' >>> # Let's inspect a simple function >>> def add(x, y): ... return x + y >>> add_sig = inspect.signature(add) >>> add_sig>>> add_sig.parameters['x'] >>> add_sig.parameters['x'].annotation >>> add_sig.return_annotation >>> # If the function has more information >>> # we can inspect more information >>> def typed_add(x: int, y: float) -> float: ... return x + y >>> typed_add_sig = inspect.signature(typed_add) >>> typed_add_sig.parameters['x'].annotation >>> typed_add_sig.return_annotation >>> # Let's pretend that we're pytest >>> # and implement a baby version of fixtures >>> def test_42_is_the_answer(the_answer): ... assert the_answer == 42 >>> fixtures = {"the answer": 42} >>> def fake_test_run(test_function): ... test_function_parameters = inspect.signature(test_function).parameters.values() ... ... if any(parameter.name not in fixtures for parameter in test_function_parameters): ... raise Exception(f"Test function expected expected fixture named {name}") ... ... arguments_to_pass = { ... parameter.name: fixtures[parameter.name] ... for parameter in test_function_parameters ... } ... ... try: ... test_function(**arguments_to_pass) ... except AssertionError as ex: ... print("Fail: Test Failed") ... print(ex) ... except Exception as ex: ... print("Error: Something bad happened") ... print(ex) ... else: ... print("Pass!") >>> fake_test_run(test_42_is_the_answer) Pass! >>> fixtures["the_answer"] = 2345 >>> fake_test_run(test_42_is_the_answer) Fail: Test Failed >>> # Goal! >>> # Our test function is *magically* getting passed an argument >>> # based on our function signature.
Оригинал: “https://dev.to/natec425/inspecting-function-annotations-in-python-1hfd”