Большинство из вас могут быть слишком молоды, чтобы знать это, но было время, когда телефон в вашем доме – не в вашем кармане! – звонит и задыхался! Вы понятия не имели, кто звонил! Вы должны были ответить на звонок, чтобы узнать. Теперь у нас есть удостоверение личности вызывающего абонента, и мы точно знаем, кто звонит – и может Полностью игнорируйте звонок Решите, отвечаем ли мы на звонок или нет.
Работая с большими приложениями, для целей отладки я считаю очень полезным, чтобы узнать, какая функция вызывает какую функцию. Точки останова и печатные операторы являются полезными инструментами, но иногда вам просто нужно больше информации. В большой кодовой базе довольно легко заблудиться с точками останова Итак, я использовал кусок кода ниже, чтобы распечатать дополнительную информацию и узнать немного больше о моем приложении.
import inspect func = inspect.currentframe().f_back.f_code print(f"in function 'my_function' called from NAME: {func.co_name} in FILENAME: {func.co_filename} on LINE#: {func.co_firstlineno}")
Как использовать
Рассмотрим * очень * простую программу (которая, честно говоря, даже не нуждается в нашей вспомогательной функции, но ради примера, оставайтесь со мной здесь):
def helper_function(value): return value.isnumeric() def adder(num1, num2): return int(num1) + int(num2) def main(): print("The most useless calculator!") first_number = input("Please enter a number: ") second_number = input("Please enter another number: ") print(f"Let's add {first_number} and {second_number}") if helper_function(first_number) and helper_function(second_number): total = adder(first_number, second_number) print(f"The total is {total}") else: print("Sorry, we cannot add these values...") main()
Вышеуказанная функция принимает два части входной формы. Командная строка (строки 11 и 12), вызывает функцию вспомогательной, чтобы проверить, являются ли введенные значения (строка 15), и если да, вызывает функцию, чтобы добавить номера (строка 16) Анкет
Теперь на мгновение давайте притворимся, что каждая из этих функций намного сложнее, чем эта, и жить в отдельных файлах. Добавьте немного функциональности, фреймворка, 2 чашки универсальной муки и веб-сервер. Вуаля! У вас есть веб -приложение. Что, если вы все еще хотите знать, какую функцию называют что? Давайте добавим наш кусок кода в Adder:
def helper_function(value): return value.isnumeric() def adder(num1, num2): import inspect func = inspect.currentframe().f_back.f_code print( f" **** in function 'adder' called from NAME: {func.co_name} in FILENAME: {func.co_filename} on LINE#: {func.co_firstlineno}" ) return int(num1) + int(num2) def main(): print("The most useless calculator!") first_number = input("Please enter a number: ") second_number = input("Please enter another number: ") print(f"Let's add {first_number} and {second_number}") if helper_function(first_number) and helper_function(second_number): total = adder(first_number, second_number) print(f"The total is {total}") else: print("Sorry, we cannot add these values...") main()
Когда вы запускаете этот скрипт сейчас (давайте сохраним его как «Watcher.py»), он выведет информацию о функции, которая называется Adder, в данном случае, Main:
>>> python3 watcher.py The most useless calculator! Please enter a number: 4 Please enter another number: 2 Let's add 4 and 2 **** in function 'adder' called from NAME: main in FILENAME: watcher.py on LINE#: 15 The total is 6
Обратите внимание, что номер строки – это линия, в которой родительская функция, в данном случае «Main», начинается, а не от того, откуда была вызвана наша функция!
Это было очень полезно, и в последнее время я много использовал. Надеюсь, это тоже вам поможет!
Выпендрежник
Вам нужно будет скопировать этот кусок кода в каждую функцию, которую вы хотели бы отладить Но это немного утомительно. Вместо этого вы можете превратить его в декоратор и украсить функции, которые вы хотите проверить. Начните с создания своего декоратора:
def caller_id(my_func): def wrapper(*args, **kwargs): import inspect my_func(*args, **kwargs) func = inspect.currentframe().f_back.f_code print( f"in function {my_func. __name__ } called from NAME: {func.co_name} in FILENAME: {func.co_filename} on LINE#: {func.co_firstlineno}" ) return wrapper
Затем вы можете украсить свою функцию. Давайте снова добавим его в Adder. Теперь Adder выглядит как:
@caller_id def adder(num1, num2): return int(num1) + int(num2)
Вот и все.
Если вы нашли это полезным, дайте мне знать на Twitter !
Пост Идентификатор вызывающего абонента для вашей функции Python _ был первоначально опубликован в _ flaviabastos.ca
Оригинал: “https://dev.to/flaviabastos/a-caller-id-for-your-python-function-4bjk”