Форум программистов, компьютерный форум, киберфорум
Python для начинающих
Войти
Регистрация
Восстановить пароль
Блоги Сообщество Поиск Заказать работу  
 
Рейтинг 4.54/70: Рейтинг темы: голосов - 70, средняя оценка - 4.54
0 / 0 / 1
Регистрация: 28.11.2013
Сообщений: 45

Декоратор

14.12.2020, 10:12. Показов 14634. Ответов 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
Ответ Создать тему
Новые блоги и статьи
Переходник USB-CAN-GPIO
Eddy_Em 20.03.2026
Достаточно давно на работе возникла необходимость в переходнике CAN-USB с гальваноразвязкой, оный и был разработан. Однако, все меня терзала совесть, что аж 48-ногий МК используется так тупо: просто. . .
Оттенки серого
Argus19 18.03.2026
Оттенки серого Нашёл в интернете 3 прекрасных модуля: Модуль класса открытия диалога открытия/ сохранения файла на Win32 API; Модуль класса быстрого перекодирования цветного изображения в оттенки. . .
SDL3 для Desktop (MinGW): Рисуем цветные прямоугольники с помощью рисовальщика SDL3 на Си и C++
8Observer8 17.03.2026
Содержание блога Финальные проекты на Си и на C++: finish-rectangles-sdl3-c. zip finish-rectangles-sdl3-cpp. zip
Символические и жёсткие ссылки в Linux.
algri14 15.03.2026
Существует два типа ссылок — символические и жёсткие. Ссылка в Linux — это запись в каталоге, которая может указывать либо на inode «файла-ИСТОЧНИКА», тогда это будет «жёсткая ссылка» (hard link),. . .
[Owen Logic] Поддержание уровня воды в резервуаре количеством включённых насосов: моделирование и выбор регулятора
ФедосеевПавел 14.03.2026
Поддержание уровня воды в резервуаре количеством включённых насосов: моделирование и выбор регулятора ВВЕДЕНИЕ Выполняя задание на управление насосной группой заполнения резервуара,. . .
делаю науч статью по влиянию грибов на сукцессию
anaschu 13.03.2026
прикрепляю статью
SDL3 для Desktop (MinGW): Создаём пустое окно с нуля для 2D-графики на SDL3, Си и C++
8Observer8 10.03.2026
Содержание блога Финальные проекты на Си и на C++: hello-sdl3-c. zip hello-sdl3-cpp. zip Результат:
Установка CMake и MinGW 13.1 для сборки С и C++ приложений из консоли и из Qt Creator в EXE
8Observer8 10.03.2026
Содержание блога MinGW - это коллекция инструментов для сборки приложений в EXE. CMake - это система сборки приложений. Здесь описаны базовые шаги для старта программирования с помощью CMake и. . .
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2026, CyberForum.ru