Из чего-то вроде этого:
print(get_indentation_level())
print(get_indentation_level())
print(get_indentation_level())
Я хотел бы получить что-то вроде этого:
1
2
3
Может ли код читать себя таким образом?
Все, что я хочу, - это вывод из более вложенных частей кода, чтобы быть более вложенными. Точно так же, как это облегчает чтение кода, облегчает чтение вывода.
Конечно, я мог бы реализовать это вручную, используя, например .format()
, но я имел в виду пользовательскую функцию печати, print(i*' ' + string)
где i
будет уровень отступа. Это был бы быстрый способ сделать читаемый вывод на моем терминале.
Есть ли лучший способ сделать это, чтобы избежать кропотливого ручного форматирования?
python
reflection
metaprogramming
indentation
tokenize
Фаб фон Беллинсгаузен
источник
источник
get_indentation_level()
в свой код. Вы можете так же хорошо делатьprint(3)
или что угодно напрямую. Что может быть более интересным, так это текущий уровень вложенности в стек вызовов функций.depth
параметр и добавляя к нему соответствующее значение по мере необходимости, когда вы передаете его другим функциям. Вложенность вашего кода, скорее всего, не будет точно соответствовать отступу, который вы хотите получить из вашего вывода.Ответы:
Если вы хотите сделать отступ с точки зрения уровня вложенности, а не пробелов и табуляций, все будет сложно. Например, в следующем коде:
призыв к
get_nesting_level
фактически вложен на один уровень глубиной, несмотря на то, что в строкеget_nesting_level
вызова нет начальных пробелов . Между тем, в следующем коде:призыв к
get_nesting_level
вложенным нулевым уровням глубины, несмотря на наличие ведущих пробелов на его линии.В следующем коде:
два вызова
get_nesting_level
находятся на разных уровнях вложенности, несмотря на то, что начальные пробелы идентичны.В следующем коде:
это вложенные нулевые уровни или один? С точки зрения
INDENT
иDEDENT
токенов в формальной грамматике, это нулевой уровень, но вы можете не чувствовать себя так же.Если вы хотите сделать это, вам нужно будет токенизировать весь файл до точки вызова, подсчета
INDENT
иDEDENT
токенов.tokenize
Модуль был бы очень полезен для такой функции:источник
get_nesting_level()
вызывается в этом вызове функции, это возвращает уровень вложенности в этой функции. Можно ли его переписать, чтобы вернуть «глобальный» уровень вложенности?while
иwith
, это было бы выполнимо, но это не то, о чем вы просили, и измените вопрос, чтобы задать что-то другое на этом этапе. было бы плохой идеей.linecache
модуль для подобных вещей - он используется для печати трассировок и может обрабатывать модули, импортированные из zip-файлов и других странных приемов импорта)linecache
может быть полезно для уменьшения количества файловых операций ввода-вывода (и спасибо, что напомнили мне об этом), но если бы я начал оптимизировать это, меня бы беспокоило, как мы избыточно повторно токенизируем один и тот же файл для повторений один и тот же вызов или для нескольких сайтов вызовов в одном файле. Есть несколько способов, которыми мы могли бы оптимизировать это тоже, но я не уверен, насколько я действительно хочу настроить и пуленепробиваемую эту сумасшедшую вещь.Да, это определенно возможно, вот рабочий пример:
источник
print('{Space}'*get_indentation_level(), x)
Вы можете использовать
sys.current_frame.f_lineno
для того, чтобы получить номер строки. Затем, чтобы найти номер уровня отступа, вам нужно найти предыдущую строку с нулевым отступом, а затем вычесть текущий номер строки из номера этой строки, и вы получите номер отступа:Демо-версия:
Если вам нужен номер уровня отступа, основанный на предыдущих строках,
:
вы можете просто сделать это с небольшим изменением:Демо-версия:
И в качестве альтернативного ответа здесь есть функция для получения номера отступа (пробела):
источник
:
пока мы не встретим строку с нулевым отступом. Проверьте редактирование!{3:4, \n 2:get_ind_num()}
Чтобы решить «реальную» проблему, которая приводит к вашему вопросу, вы можете реализовать контекстный менеджер, который отслеживает уровень отступа и делает
with
структуру блока в коде соответствующей уровням отступа выходных данных. Таким образом, отступ кода по-прежнему отражает отступ вывода без слишком сильного связывания обоих. Тем не менее все еще возможно преобразовать код в другие функции и иметь другие отступы, основанные на структуре кода, не мешая выходному отступу.Вывод:
источник
источник