0 / 0 / 1
Регистрация: 28.11.2013
Сообщений: 45

Декоратор

14.12.2020, 10:12. Показов 14663. Ответов 8
Метки нет (Все метки)

Студворк — интернет-сервис помощи студентам
всем привет, задание такое
# Написать декоратор, который будет логировать (записывать в лог файл)
# ошибки из декорируемой функции и выбрасывать их дальше.
#
# Имя файла лога - function_errors.log
# Формат лога: <имя функции> <параметры вызова> <тип ошибки> <текст ошибки>
# Лог файл открывать каждый раз при ошибке в режиме 'a'

написал вот такой код:

Python
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
def log_errors(func):
    def surrogate(*args, **kwargs):
        file_name = 'function_errors.log'
        file = open(file_name, mode='a')
        file_content = line
        file.write(file_content + '\n')
        result = func(*args, **kwargs)
        return result
    return surrogate
 
 
# Проверить работу на следующих функциях
@log_errors
def perky(param):
    return param / 0
 
 
@log_errors
def check_line(line):
    name, email, age = line.split(' ')
    if not name.isalpha():
        raise ValueError("it's not a name")
    if '@' not in email or '.' not in email:
        raise ValueError("it's not a email")
    if not 10 <= int(age) <= 99:
        raise ValueError('Age not in 10..99 range')
 
 
lines = [
    'Ярослав bxh@ya.ru 600',
    'Земфира tslzp@mail.ru 52',
    'Тролль nsocnzas.mail.ru 82',
    'Джигурда wqxq@gmail.com 29',
    'Земфира 86',
    'Равшан wmsuuzsxi@mail.ru 35',
]
for line in lines:
    try:
        check_line(line)
    except Exception as exc:
        print(f'Invalid format: {exc}')
perky(param=42)
как вывести в сам лог текст ошибки?
и что делать с функцией perky, ловить exception и писать в файл?
0
Programming
Эксперт
39485 / 9562 / 3019
Регистрация: 12.04.2006
Сообщений: 41,671
Блог
14.12.2020, 10:12
Ответы с готовыми решениями:

Написать простой декоратор, используя декоратор wraps, для передачи данных от оригинальной функции
На python Написать простой декоратор, используя декоратор wraps, для передачи данных от оригинальной функции. Реализовать простую функцию...

Декоратор
Не понимаю, как в код добавить декоратор. def avg(*a): return sum(a)/len(a) print(avg(1,2,3,4,5))

Декоратор
Нужно создать декоратор который будет обрамлять введенный текст знаком &quot;=&quot;. Вывод должен быть таким: ========== =Hello, World!= ...

8
Просто Лис
Эксперт Python
 Аватар для Рыжий Лис
5973 / 3735 / 1099
Регистрация: 17.05.2012
Сообщений: 10,791
Записей в блоге: 9
14.12.2020, 10:19
Цитата Сообщение от icetanker Посмотреть сообщение
ловить exception и писать в файл?
Да. Как-то так:

Python
1
2
3
4
5
6
7
8
9
def log_errors(func):
    def wrap(*args, **kwargs):
        try:
            return func(*args, **kwargs)
        except Exception as e:
            print('Ахтунг!', e)
            raise e
 
    return wrap
1
0 / 0 / 1
Регистрация: 28.11.2013
Сообщений: 45
14.12.2020, 10:32  [ТС]
Рыжий Лис, с исключением понятно, а вот как сделать так, чтобы в лог результат писался, он у меня пишется в вывод, а в сам файл пишется только сами проверяемые строки, в коде получается резалт возвращается после записи, если записывать дважды, происходит дикая чушь

сейчас написал согласно рекомендациям
Python
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
def log_errors(func):
    def surrogate(*args, **kwargs):
        file_name = 'function_errors.log'
        file = open(file_name, mode='a')
        file_content = line
        file.write(file_content + '\n')
        try:
           result = func(*args, **kwargs)
        except Exception as e:
            print('exception', e)
            raise e
        return result
    return surrogate
 
 
# Проверить работу на следующих функциях
@log_errors
def perky(param):
    return param / 0
 
 
@log_errors
def check_line(line):
    name, email, age = line.split(' ')
    if not name.isalpha():
        raise ValueError("it's not a name")
    if '@' not in email or '.' not in email:
        raise ValueError("it's not a email")
    if not 10 <= int(age) <= 99:
        raise ValueError('Age not in 10..99 range')
 
 
lines = [
    'Ярослав bxh@ya.ru 600',
    'Земфира tslzp@mail.ru 52',
    'Тролль nsocnzas.mail.ru 82',
    'Джигурда wqxq@gmail.com 29',
    'Земфира 86',
    'Равшан wmsuuzsxi@mail.ru 35',
]
for line in lines:
    try:
        check_line(line)
    except Exception as exc:
        print(f'Invalid format: {exc}')
perky(param=42)
0
Просто Лис
Эксперт Python
 Аватар для Рыжий Лис
5973 / 3735 / 1099
Регистрация: 17.05.2012
Сообщений: 10,791
Записей в блоге: 9
14.12.2020, 11:04
И что? Ты в файл записать текст исключения не можешь?

Python
1
2
file = open('log.log', mode='a')
print('exception', e, file=file)
1
0 / 0 / 1
Регистрация: 28.11.2013
Сообщений: 45
14.12.2020, 11:21  [ТС]
Рыжий Лис, странно, почему то без exception не записывала, а сейчас все ок))
а можно ли каким то образом убрать сам красный exception выводимый на консоле?

на консоле рейзит e, но насколько я понимаю, он красным ее выводить не должен
File "/home/iceforest/PycharmProjects/python_base/python_base/lesson_011/04_error_log_decorator.py", line 58, in <module>
perky(param=42)
File "/home/iceforest/PycharmProjects/python_base/python_base/lesson_011/04_error_log_decorator.py", line 23, in surrogate
raise e
File "/home/iceforest/PycharmProjects/python_base/python_base/lesson_011/04_error_log_decorator.py", line 18, in surrogate
result = func(*args, **kwargs)
File "/home/iceforest/PycharmProjects/python_base/python_base/lesson_011/04_error_log_decorator.py", line 31, in perky
return param / 0
ZeroDivisionError: division by zero
0
3 / 3 / 0
Регистрация: 27.10.2022
Сообщений: 7
28.10.2022, 13:14
Python
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
from datetime import datetime
from time import sleep
import functools
from typing import Callable, Any
 
 
def logging(func: Callable) -> Callable:
    """Декоратор. Логирует ошибки функций с указанием даты и времени возникновения."""
 
    @functools.wraps(func)
    def wrapped_func(*args, **kwargs) -> Any:
        try:
            print(f'{func.__name__}\n{func.__doc__}')
            function = func(*args, **kwargs)
            return function
        except Exception as exc:
            string = '{} - {}:\t{}\n'.format(datetime.now(), func.__name__, exc)
            with open('function_errors.log', 'a', encoding='utf-8') as log:
                log.write(string)
    return wrapped_func
 
 
@logging
def division_by_zero():
    """Деление на нуль."""
    return 5 / 0
 
 
@logging
def value_error():
    """Вызывает ValueError."""
    sleep(1)
    raise ValueError
 
 
@logging
def name_error():
    """Вызывает NameError."""
    sleep(1)
    raise NameError
 
 
@logging
def index_error():
    """Вызывает IndexError."""
    sleep(1)
    raise IndexError
 
 
division_by_zero()
value_error()
name_error()
index_error()
у меня такой код, но в лог пишет первую ошибку как надо, а остальные только дата/время и имя функции, без названия ошибки, как отремонтировать?
0
2431 / 1474 / 633
Регистрация: 01.11.2021
Сообщений: 2,269
28.10.2022, 13:34
Python
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
from datetime import datetime
from time import sleep
import functools
from typing import Callable, Any
 
 
def logging(func: Callable) -> Callable:
    """Декоратор. Логирует ошибки функций с указанием даты и времени возникновения."""
 
    @functools.wraps(func)
    def wrapped_func(*args, **kwargs) -> Any:
        try:
            print(f'{func.__name__}\n{func.__doc__}')
            function = func(*args, **kwargs)
            return function
        except Exception as exc:
            string = '{} - {}:\t{}\n'.format(datetime.now(), func.__name__, exc)
            with open('function_errors.log', 'a', encoding='utf-8') as log:
                log.write(string)
 
    return wrapped_func
 
 
@logging
def division_by_zero():
    """Деление на нуль."""
    return 5 / 0
 
 
@logging
def value_error():
    """Вызывает ValueError."""
    sleep(1)
    raise ValueError('Неверное значение')
 
 
@logging
def name_error():
    """Вызывает NameError."""
    sleep(1)
    raise NameError('Неверное имя')
 
 
@logging
def index_error():
    """Вызывает IndexError."""
    sleep(1)
    raise IndexError('Нет такого индекса')
 
 
division_by_zero()
value_error()
name_error()
index_error()
Добавлено через 11 секунд
spectral70,
0
3 / 3 / 0
Регистрация: 27.10.2022
Сообщений: 7
28.10.2022, 16:05
Python
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
@logging
def division_by_zero() -> float:
    """Деление на нуль."""
    return 5 / 0
 
 
@logging
def type_error() -> float:
    """Вызывает TypeError."""
    sleep(1)
    one = 5
    two = '14'
    return one / two
 
 
@logging
def name_error() -> None:
    """Вызывает NameError."""
    sleep(1)
    x = y
 
 
@logging
def index_error() -> int:
    """Вызывает IndexError."""
    sleep(1)
    lst = [2, 2]
    return lst[2]
 
 
@logging
def value_error():
    """Вызывает ValueError."""
    sleep(1)
    return sqrt(-4)
 
 
division_by_zero()
type_error()
name_error()
index_error()
value_error()
переписал функции без
Python
1
raise
, ибо их не пишет в лог. Заданию, по идее, удовлетворяет, но, как писать в лог
Python
1
raise
, так и не разобрался

Добавлено через 36 секунд
Alexarh, просто строчку надо пропустить?)
0
2431 / 1474 / 633
Регистрация: 01.11.2021
Сообщений: 2,269
28.10.2022, 16:23
spectral70,
ничего не понял из последнего. Просто скопируй код, все там пишет.

Добавлено через 2 минуты
Python
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
from datetime import datetime
from time import sleep
import functools
from typing import Callable, Any
 
 
def logging(func: Callable) -> Callable:
    """Декоратор. Логирует ошибки функций с указанием даты и времени возникновения."""
 
    @functools.wraps(func)
    def wrapped_func(*args, **kwargs) -> Any:
        try:
            print(f'{func.__name__}\n{func.__doc__}')
            function = func(*args, **kwargs)
            return function
        except Exception as exc:
            string = '{} - {}:\t{}\n'.format(datetime.now(), func.__name__, exc)
            with open('function_errors.log', 'a', encoding='utf-8') as log:
                log.write(string)
 
    return wrapped_func
 
 
@logging
def division_by_zero():
    """Деление на нуль."""
    sleep(1)
    raise ZeroDivisionError('Деление на ноль')
 
 
@logging
def value_error():
    """Вызывает ValueError."""
    sleep(1)
    raise ValueError('Неверное значение')
 
 
@logging
def name_error():
    """Вызывает NameError."""
    sleep(1)
    raise NameError('Неверное имя')
 
 
@logging
def index_error():
    """Вызывает IndexError."""
    sleep(1)
    raise IndexError('Нет такого индекса')
 
 
division_by_zero()
value_error()
name_error()
index_error()
Добавлено через 1 минуту
В итоге должно быть что-то типа этого, на примере одной функции
Python
1
2
3
4
5
6
@logging
def division_by_zero(a, b):
    """Деление на нуль."""
    if b == 0:
        raise ZeroDivisionError('Деление на ноль')
    return a / b
1
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
inter-admin
Эксперт
29715 / 6470 / 2152
Регистрация: 06.03.2009
Сообщений: 28,500
Блог
28.10.2022, 16:23
Помогаю со студенческими работами здесь

Декоратор
Помогите пожалуйста с решением задачи. Код написал, но где-то, что-то не так... Задача: Создать декоратор для функции, которая...

Декоратор для кэширования
Напишите декоратор cached, который будет кэшировать результат вызова функции. Пример того, как можно будет использовать ваш декоратор: ...

Декоратор для кэширования
Задача: Напишите декоратор cached, который будет кэшировать результат вызова функции. Пример того, как можно будет использовать ваш...

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

Декоратор. Docstring метода
Всем привет! Осваиваю декораторы, возникло непонимание. Как вывести в консоль документацию метода класса? import functools ...


Искать еще темы с ответами

Или воспользуйтесь поиском по форуму:
9
Ответ Создать тему
Опции темы

Новые блоги и статьи
Отчёт о затраченных материалах за определенный период с макетом печатной формы
Maks 21.04.2026
Отчёт из решения ниже размещён в конфигурации КА2. Задача: разработка отчёта по затраченным материалам за определённый период, с возможностью вывода печатной формы отчёта с шапкой и подвалом. В. . .
Отчёт о спецтехнике находящейся в ремонте
Maks 20.04.2026
Отчёт из решения ниже размещен в конфигурации КА2. Задача: отобразить спецтехнику, которая на данный момент находится в ремонте. Есть нетиповой документ "Заявка на ремонт спецтехники" который. . .
Памятка для бота и "визитка" для читателей "Semantic Universe Layer (Слой семантической вселенной)"
Hrethgir 19.04.2026
Сгенерировано для краткого описания по случаю сборки и компиляции скелета серверного приложения. И пусть после этого скажут, что статьи сгенерированные AI - туфта и не интересно. И это не реклама -. . .
Запрет удаления строк ТЧ документа при определённом условии
Maks 19.04.2026
Алгоритм из решения ниже реализован на примере нетипового документа "Аккумуляторы", разработанного в конфигурации КА2. У данного документа есть ТЧ, в которой в зависимости от прав доступа. . .
Модель заражения группы наркоманов
alhaos 17.04.2026
Условия задачи сформулированы тут Суть: - Группа наркоманов из 10 человек. - Только один инфицирован ВИЧ. - Колются одной иглой. - Колются раз в день. - Колются последовательно через. . .
Мысли в слух. Про "навсегда".
kumehtar 16.04.2026
Подумалось тут, что наверное очень глупо использовать во всяких своих установках понятие "навсегда". Это очень сильное понятие, и я только начинаю понимать край его смысла, не смотря на то что давно. . .
My Business CRM
MaGz GoLd 16.04.2026
Всем привет, недавно возникла потребность создать CRM, для личных нужд. Собственно программа предоставляет из себя базу данных клиентов, в которой можно фиксировать звонки, стадии сделки, а также. . .
Знаешь почему 90% людей редко бывают счастливыми?
kumehtar 14.04.2026
Потому что они ждут. Ждут выходных, ждут отпуска, ждут удачного момента. . . а удачный момент так и не приходит.
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2026, CyberForum.ru