Рубрики
Без рубрики

Идентификатор абонента для вашей функции Python

Большинство из вас могут быть слишком молоды, чтобы знать это, но было время, когда телефон в вашем доме – не в … Tagged with Howto, Python, Debug, Decorator.

Большинство из вас могут быть слишком молоды, чтобы знать это, но было время, когда телефон в вашем доме – не в вашем кармане! – звонит и задыхался! Вы понятия не имели, кто звонил! Вы должны были ответить на звонок, чтобы узнать. Теперь у нас есть удостоверение личности вызывающего абонента, и мы точно знаем, кто звонит – и может Полностью игнорируйте звонок Решите, отвечаем ли мы на звонок или нет.

Работая с большими приложениями, для целей отладки я считаю очень полезным, чтобы узнать, какая функция вызывает какую функцию. Точки останова и печатные операторы являются полезными инструментами, но иногда вам просто нужно больше информации. В большой кодовой базе довольно легко заблудиться с точками останова Итак, я использовал кусок кода ниже, чтобы распечатать дополнительную информацию и узнать немного больше о моем приложении.

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”