Рубрики
Без рубрики

Python Scripting Toolbox: Часть 2 – Строковые шаблоны и `argparse`

Часть 2 из 3. Пара способов договариваться со своими сценариями Python со стандартной библиотекой. Теги с Python, сценарием, учебником.

Обложка Фото от Philip Swinburn на Unsplash

Это часть 2 в серии панели инструментов Python Scripting. Это трехкомнатная обзор инструментов, доступных для нас для сценариев Python. Я демонстрирую функциональность, создавая три сценарии, которые показывают разные части стандартной библиотеки.

  1. В Часть 1 мы построили Shout.py : скрипт, который кричит все, что вы переходите в него.
  2. В части 2 мы создадим make_script.py. : скрипт, который генерирует скрипт стартера из шаблона, для использования в таких вещах, как Проект Эйлер или Розалинда Отказ
  3. В следующий раз, часть 3 будет работать project_setup.py. : скрипт, который создает базовый проект скелет

Теперь давайте начнем.

Скрипт 2: make_script.py

При выполнении вызовов кодирования, где вы должны написать код на локальной машине, а затем просто отправить ответ, как только вы найдете его, вы оказываетесь переписать много одной и той же пластины для котельной и снова для чтения в аргументах командной строки, разборки вещей И результаты вывода, когда реальное мясо и картофель вашей работы в основной функции скрипта. Обработка ввода и вывода – это только боковая задача. Разве не было бы неплохо, если бы мы могли просто скриптировать эту руческую работу и начнутся на проблему кодирования раньше? Это то, что мы делаем сегодня.

Вот наши требования. Мы создаем сценарий Python под названием make_script.py Отказ Мы хотим, чтобы это создать сценарий Python из шаблона, заполняя некоторые имена переменных, DocStrings или других небольших вариаций на основе наших пользовательских входов. Если бы он мог иметь разумные значения по умолчанию, это было бы плюс. Давайте начнем.

Шаг 1: Шаблон

Во-первых, я хочу придумать, как должен выглядеть наш шаблон. Откройте файл с именем script.py.template Отказ Это не конвенция, это файл окончательный, который я составил. Вы можете назвать это, все, что вы хотите.

"""$docstring"""

import sys


def main($input):
    $output = ""
    return $output


if __name__ == "__main__":
    $input = sys.argv[1]
    $output = main($input)
    print($output)

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

Но Райан! Что со всеми этими знаками доллара? Я думал, что это был python, а не php!

Ты прав. Мы собираемся использовать шаблон Класс в Python Строка Модуль стандартной библиотеки. Приятно отметить, что есть несколько очень хороших библиотек шаблонов, которые не в стандартной библиотеке, но имеют довольно большую мощность. Jinja2 и Шаблоны Django Приходите сразу. Но это приведет нас, где нам нужно идти.

С помощью этого шаблонного языка мы просто указываем переменную с знак доллара перед ним. Если вы хотите показать фактический Знак доллара, просто используйте 2 доллара подписи подряд ( $$ ). Это будет отображаться как один знак доллара. Теперь, на нашем настоящем коде.

Шаг 2: заполнение шаблона

Код на самом деле заполнить этот шаблон, не очень много строк. Создайте новый файл под названием make_script.py. .

"""Creates a script from a basic template."""

import string

with open("script.py.template", "r") as f:
    template_text = f.read()

data = {
    "docstring": "Hey look at this cool script.",
    "input": "dat_arg",
    "output": "awesome_result"
}

template = string.Template(template_text)
result = template.substitute(data)

with open("new_script.py", "w") as f:
    f.write(result)

print(result)
print("----")
print("Script created!")

Есть по существу четыре шага к этому:

  1. Прочитайте шаблон в строку.
  2. Создайте объект шаблона из этой строки (предусмотренный стандартной платой string модуль).
  3. Замените данные. Это можно сделать как аргументы ключевых слов к Замените метод или (как мы это делали) как словарь. В любом случае, ключи должны быть названиями переменных, определенных в шаблоне, и значения должны быть то, что вы хотите заменить.
  4. Напишите вновь обрабатываемый результат в новый файл.

Если вы попробуете работать python make_script.py . , вы должны увидеть результаты замены в вашем терминале, а также в новом файле под названием new_script.py Отказ Довольно круто, Ja?

Это здорово, но мы не хотим войти и изменять ценности в make_script.py В любое время мы хотим создать новый скрипт. Мы хотели бы, чтобы наш скрипт был немного более динамичным, и, возможно, имеет небольшой лучший пользовательский интерфейс. Похоже, пришло время …

Шаг 3: АрГАПАРТАПРАВИТЬ НАШИ ПРИНЯТЬСЯ

Мы хотели бы наш скрипт, чтобы взять некоторые аргументы, некоторые варианты, и, возможно, показывают помощь в справке. Еще раз, я хотел бы отметить, что там есть отличные библиотеки CLI, если вы хотите немного больше энергии. Я думаю Нажмите наверное, мой любимый. Я написал статью некоторое время назад о используя нажмите Отказ Будьте нежны – это был один из моих первых сообщений в блоге!

В любом случае, мы привержены использовать Только Стандартная библиотека в этих гидах, поэтому мы будем солдат с нашим другом argparse. . Для получения дополнительных примеров и информации вы можете взглянуть на argparse Документация Отказ На данный момент я думаю, что лучше всего показать вам новую, блестящую версию make_script.py. .

"""Creates a script from a basic template."""

import argparse
import string

parser = argparse.ArgumentParser(description="Create new Python scripts from a template.")
parser.add_argument("scriptname", help="The name of the new script to create")
parser.add_argument(
    "-d", 
    "--docstring",
    help="The docstring to be placed at the top of the script",
    default="Placeholder docstring"
)
parser.add_argument(
    "-i",
    "--input",
    help="The name of the variable used as the input parameter",
    default="inval"
)
parser.add_argument(
    "-r",
    "--result",
    help="The name of the variable used as the result/output",
    default="result"
)

args = parser.parse_args()

# ...  You'll see how we use these args in a minute

Как только мы импортировали argparse Модуль, мы можем создать наш аргумент парсера. Мы расскажем об этом парсере аргумента об всех аргументах и вариантах, которые мы ожидаем. По умолчанию любой аргумент, который начинается с - считается необязательным … UM … вариант, в то время как все остальное считается необходимым аргументом.

Если вы предоставляете каждый аргумент с помощью Помогите Значение, это сделает вашу помощь текст действительно выглядеть блестящим. В конце вы обрабатываете аргументы, предоставляемые пользователем с parse_args метод. Давайте посмотрим, как их использовать.

# ... Everything in the previous code block

with open("script.py.template", "r") as f:
    template_text = f.read()

data = {
    "docstring": args.docstring,
    "input": args.input,
    "output": args.result
}

template = string.Template(template_text)
result = template.substitute(data)

with open(args.scriptname, "w") as f:
    f.write(result)

print(result)
print("----")
print("Script created!")

Все аргументы доступны под args пространство имен , что в основном просто означает, что вы можете получить доступ к ним через args.whever_your_variable_is Отказ Имя переменной будет любое имя, которое вы передаете в add_argument метод.

Теперь, если вы запустите свой скрипт, он будет жаловаться, если правильные вещи не передаются, и Если вы запустите python make_script.py -help Он печатает довольно мало помощи.

$ python make_script.py --help
usage: make_script.py [-h] [-d DOCSTRING] [-i INPUT] [-r RESULT] scriptname

Create new Python scripts from a template.

positional arguments:
  scriptname            The name of the new script to create

optional arguments:
  -h, --help            show this help message and exit
  -d DOCSTRING, --docstring DOCSTRING
                        The docstring to be placed at the top of the script
  -i INPUT, --input INPUT
                        The name of the variable used as the input parameter
  -r RESULT, --result RESULT
                        The name of the variable used as the result/output

В следующий раз мы будем работать над сценарием, который создаст для нас каталог проекта. Спасибо за чтение!

Первоначально опубликовано Assert_not Magic?

Оригинал: “https://dev.to/rpalo/python-scripting-toolbox-part-2—string-templates-and-argparse-4lbh”