Вызов функции из функции / Python3

Рейтинг: -1Ответов: 3Опубликовано: 26.08.2023

Помогите найти решение.

При вызове функции send_message, она должна вызывать функцию check_status.

Функция check_status проверяет значение переменной status, если значение 1, то функция send_message должна продолжить работать, а если status == 0, то функция send_message должна остановиться.

Выполнить проверку stasus внутри функции я не могу, потому что будет еще не сколько функций, где нужно будет проверять status. Я не хочу нарушать принцип пайтона DRY

status = 0


def stop(message):
    global status
    if message == '/stop':
        status = 0
    else:
        None


def check_status():
    global status
    if status == 1:
        return
    else:
        None


def send_message(message):
    check_status()
    print('qq')


print(status)
send_message('Privet')
print(status)

Вот какой ответ мне возвращает терминал:

(venv) fastlinkdevops@DevOps:~/dev/bot/Drinking_Companion_BOT$ python3 test.py
0
qq
0

Я хочу избежать такой конструкции, в пользу вызовов функций, в которых будут проходить проверки

def send_message(message):
    if check_status():
        if user_id in black_list:
            if user_id in group_user:
                print('hi')
            else:
                None
        else:
            print('Вы в чс')
    else:
        None

Ответы

▲ 0Принят

Вариант с Exception:

status = 0

def check_status(status: int):
    if status == 0:
        raise Exception("Status is bad")
    
def send_message(message):
    global status
    try:
        check_status(status)
    except:
        return
    print('qq')
    
print(status)
send_message('Privet')
print(status)

Вывод:

0
0

т.к. status = 0

По аналогии добавляем другие функции проверки

▲ 1
def check_status():
    global status
    if status == 0:
       return False
    if user_id in black_list:
       return False
    if not (user_id in group_user):
       return False
    return True
           

def send_message(message):
    if check_status():
        print('qq')

Можно проверить много условий

Глобальная переменная зло, выстрелит в не подходящий момент.

▲ 1

Как вариант, можно использовать декоратор.

Код:

status = 0

def check_status(func):
    def inner(*args, **kwargs):
        if status == 0:
            return
        func(*args, **kwargs)
    return inner

@check_status
def send_message(message):
    print(message)

status = 1
print(status)
send_message('Privet')

status = 0
print(status)
send_message('Poka')

Вывод:

1
Privet
0

Как видно по выводу программы, при статусе выставленном в 1 задекорированная функция отработала, а при статусе 0 - нет.

Декораторы - очень удобный инструмент для управления поведением функций без изменения их кода.