Нахождение номера строки в Python: практические приёмы
Способы вывода номера строки в Python
Наиболее распространенный и эффективный способ получить номер строки при последовательной обработке текстового файла или списка строк заключается в использовании встроенной функции enumerate. Этот метод возвращает кортеж (индекс, элемент), при этом отсчет по умолчанию начинается с нуля. Для нумерации строк с единицы достаточно передать параметр start=1.
with open('data.txt', 'r', encoding='utf-8') as f:
for line_number, line in enumerate(f, start=1):
print(f'Строка {line_number}: {line.rstrip()}')
Python strip (метод strip в python)
В результате каждая строка файла выводится вместе со своим номером. Применение enumerate уместно в любых сценариях, где требуется нумерованный перебор элементов: чтение логов, разбор CSV, обработка списков.
Как получить номер строки в коде, который выполняется в данный момент?
Если требуется узнать номер строки, на которой находится вызов некоторой функции, применяется модуль inspect. Метод currentframe() возвращает фрейм текущего исполнения, а атрибут f_lineno хранит номер строки.
import inspect
def show_line():
frame = inspect.currentframe()
line_no = frame.f_lineno
print(f'Номер строки вызова функции: {line_no}')
show_line()
Python повторить строку (повторение строки в python)
Важно помнить, что inspect.currentframe() может работать медленнее при частых вызовах. Кроме того, в некоторых окружениях (например, при оптимизации кода) эта информация может быть недоступна. Альтернативой выступает sys._getframe(), но он считается внутренней функцией и не рекомендуется для production‑кода.
Как узнать номер строки в обработчике исключений?
При перехвате исключения можно извлечь номер строки из объекта трассировки. Модуль traceback предоставляет удобные функции для анализа стека.
import traceback
try:
result = 1 / 0
except ZeroDivisionError:
tb = traceback.extract_tb()
last_call = tb[-1]
print(f'Ошибка в строке {last_call.lineno}')
Tuple в str python (преобразование кортежа в строку в python)
Такой подход полезен в логировании ошибок с детальной информацией о месте возникновения.
Как вывести номер первой строки функции или метода?
Для целей отладки или генерации документации иногда необходимо получить номер строки, с которой начинается определение функции. Это можно сделать через атрибут __code__ и его свойство co_firstlineno.
def my_function():
pass
print(f'Функция начинается на строке {my_function.__code__.co_firstlineno}')
Python объект в строку (преобразование объекта в строку в python)
Как отследить номер строки в многострочном выражении или декораторе?
При использовании декораторов исходный номер строки оборачиваемой функции может измениться, так как декоратор создает новую функцию. Чтобы сохранить оригинальную информацию, полезно применять functools.wraps. Внутри декоратора номер строки можно получить с помощью inspect.
from functools import wraps
import inspect
def log_line(func):
@wraps(func)
def wrapper(*args, **kwargs):
frame = inspect.currentframe()
caller_frame = frame.f_back
print(f'Вызов {func.__name__} из строки {caller_frame.f_lineno}')
return func(*args, **kwargs)
return wrapper
@log_line
def test():
pass
test()
При работе с фреймами необходимо учитывать, что inspect.currentframe() возвращает фрейм самой функции log_line, а не вызывающей стороны. Для получения номера строки вызывающего кода используется frame.f_back. Ошибка может возникнуть, если этот атрибут равен None (например, на верхнем уровне интерактивной сессии).
Расширенные примеры и нестандартные ситуации
Вывод номеров строк при чтении файла с пропусками пустых строк
with open('example.txt', 'r') as f:
for num, line in enumerate(f, 1):
if line.strip():
print(f'{num}: {line.rstrip()}')
1: Первая непустая строка 3: Третья (вторая пустая пропущена) ...
Получение номера строки через стек вызовов (traceback.format_stack)
import traceback
def show_stack():
stack = traceback.format_stack()
for line in stack:
print(line.strip())
show_stack()
File "test.py", line 6, in show_stack
stack = traceback.format_stack()
File "test.py", line 8, in <module>
show_stack()
Этот метод выводит полный стек вызовов с номерами строк; полезен для глубокой отладки.
Применение sys._getframe() для получения номера строки в одну команду
import sys
def quick_line():
return sys._getframe().f_lineno
print(quick_line())
3
Обратите внимание: использование sys._getframe() не гарантируется во всех реализациях Python (в CPython работает).
Номер строки в многопоточном приложении
import inspect
import threading
def thread_task():
frame = inspect.currentframe()
print(f'Поток {threading.current_thread().name}, строка {frame.f_lineno}')
threads = [threading.Thread(target=thread_task) for _ in range(3)]
for t in threads:
t.start()
for t in threads:
t.join()
Поток Thread-1, строка 5 Поток Thread-2, строка 5 Поток Thread-3, строка 5
Каждый поток получает номер строки внутри своей функции корректно.
Декоратор для логирования номера строки вызова
import inspect
from functools import wraps
def log_caller_line(func):
@wraps(func)
def wrapper(*args, **kwargs):
caller_frame = inspect.currentframe().f_back
print(f'Функция {func.__name__} вызвана со строки {caller_frame.f_lineno}')
return func(*args, **kwargs)
return wrapper
@log_caller_line
def sample():
pass
sample()
Функция sample вызвана со строки 12
Такой декоратор удобен для аудита вызовов в сложных проектах.