Как пропустить строку документации с помощью регулярного выражения

Я пытаюсь вставить несколько строк импорта в исходный файл Python, но в идеале я хотел бы разместить их сразу после исходной строки документации. Скажем, я загружаю файл в строковую переменную следующим образом:

lines = open('filename.py').readlines()

Как найти номер строки, на которой заканчивается строка документации?

Обратите внимание, что PEP8 рекомендует помещать импорт перед строками документации.

Thomas Vander Stichele 01.10.2008 11:47

Нет, PEP8 не рекомендует этого, и на самом деле это сделает строки документации, а не строки документов. Строки документации являются только строками документации, когда они являются первым выражением в модуле, классе или функции. PEP8 говорит, что импорт должен происходить сразу после комментариев и строк документации.

Thomas Wouters 01.10.2008 12:29
Почему в Python есть оператор "pass"?
Почему в Python есть оператор "pass"?
Оператор pass в Python - это простая концепция, которую могут быстро освоить даже новички без опыта программирования.
Некоторые методы, о которых вы не знали, что они существуют в Python
Некоторые методы, о которых вы не знали, что они существуют в Python
Python - самый известный и самый простой в изучении язык в наши дни. Имея широкий спектр применения в области машинного обучения, Data Science,...
Основы Python Часть I
Основы Python Часть I
Вы когда-нибудь задумывались, почему в программах на Python вы видите приведенный ниже код?
LeetCode - 1579. Удаление максимального числа ребер для сохранения полной проходимости графа
LeetCode - 1579. Удаление максимального числа ребер для сохранения полной проходимости графа
Алиса и Боб имеют неориентированный граф из n узлов и трех типов ребер:
Оптимизация кода с помощью тернарного оператора Python
Оптимизация кода с помощью тернарного оператора Python
И последнее, что мы хотели бы показать вам, прежде чем двигаться дальше, это
Советы по эффективной веб-разработке с помощью Python
Советы по эффективной веб-разработке с помощью Python
Как веб-разработчик, Python может стать мощным инструментом для создания эффективных и масштабируемых веб-приложений.
1
2
976
3
Перейти к ответу Данный вопрос помечен как решенный

Ответы 3

Ответ принят как подходящий

Если вы используете стандартный формат строки документации, вы можете сделать что-то вроде этого:

count = 0
for line in lines:
    if line.startswith ('"""'):
        count += 1
        if count < 3:
            # Before or during end of the docstring
            continue
    # Line is after docstring

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

Не забывайте, что строка документации - это не просто строковый литерал, заключенный в тройные кавычки. Строка документации - это строковый литерал Любые, который является первым выражением в модуле, классе или функции. Он может использовать "" ", '' ',",' или даже r "" ", r '' ', r', r", u "" ", u '' ', u", u', ur "" ", ur '' ', ur" или ur' для вступительных цитат.

Thomas Wouters 01.10.2008 12:32

Вот что я имею в виду под «стандартным форматом строки документации» - в PEP 8 говорится об использовании трехстрочных литералов.

John Millikin 01.10.2008 22:15

Даже со "стандартными" строками документации есть несколько хитрых вариантов. См. Рекомендации PEP257 по строкам документов в Юникоде и необработанных строках. Также существует общий случай однострочности, когда "" "не находится в начале строки. Также рассмотрите возможность использования строк документации со встроенными строками" "" с помощью экранирования (\ "" ")

Brian 02.10.2008 01:51

Вместо того, чтобы использовать регулярное выражение или полагаться на определенное форматирование, вы можете использовать модуль токенизации python.

import tokenize
f=open(filename)
insert_index = None
for tok, text, (srow, scol), (erow,ecol), l in tokenize.generate_tokens(f.readline):
    if tok == tokenize.COMMENT:
        continue
    elif tok == tokenize.STRING:
        insert_index = erow, ecol
        break
    else:
        break # No docstring found

Таким образом вы можете справиться даже с патологическими случаями, такими как:

# Comment
# """Not the real docstring"""
' this is the module\'s \
docstring, containing:\
""" and having code on the same line following it:'; this_is_code=42

точно так, как питон справился бы с ними.

Это функция, основанная на блестящем ответе Брайана, которую вы можете использовать для разделения файла на строку документации и код:

def split_docstring_and_code(infile):

    import tokenize
    insert_index = None
    f = open(infile)
    for tok, text, (srow, scol), (erow,ecol), l in tokenize.generate_tokens(f.readline):
        if tok == tokenize.COMMENT:
            continue
        elif tok == tokenize.STRING:
            insert_index = erow, ecol
            break
        else:
            break # No docstring found

    lines = open(infile).readlines()
    if insert_index is not None:
        erow = insert_index[0]
        return "".join(lines[:erow]), "".join(lines[erow:])
    else:
        return "", "".join(lines)

Предполагается, что строка, завершающая строку документации, не содержит дополнительного кода за закрывающим разделителем строки.

Другие вопросы по теме