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

Создайте небольшой интерфейс командной строки, используя функцию Python

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

Всем привет ! Я французский студент в области компьютерных наук, и сегодня я расскажу о модуле, который я создал, чтобы автоматизировать генерацию CLI, используя модуль Incest и Argarse Python. Это мой первый пост на dev.to. Для меня это вызов в нескольких моментах, с одной стороны, он заставил меня написать на английском языке (я стараюсь изо всех сил, чтобы избежать ошибок), а в другой это заставляет меня общаться о своих работах и (я надеюсь) получить критику по этому поводу. Также я надеюсь, что это даст вам новые идеи на основе модуля Inspect. Теперь давайте погрузимся в тему!

Прошло много времени с тех пор, как я использовал Python для создания небольших сценариев для алгоритмов глубокого обучения и в основном разрабатывать некоторые файлы. В большинстве случаев эти сценарии в конечном итоге получают некоторые параметры, которые я должен настраивать, прежде чем их запустить. Чтобы не модифицировать скрипт каждый раз, я использую модуль Argparse, чтобы создать из них небольшой CLI. К сожалению, в большинстве случаев сценарий, который я хочу запустить с параметрами, является лишь одной основной функцией с некоторыми параметрами. Здесь вы можете увидеть небольшой пример с прототипом функции, которая преобразует файл CSV в файл JSON, и как вы должны использовать модуль ArgParse для создания вашего CLI:

import argparse

def csvToJson(infile,outfile:str="out.json",separator:str="\t"):
    """
    Simple function allowing to build a json file based on a csv one
    :param infile: Name of the file to transform
    :param outfile: Name of the output file
    :param separator: Token use by the csv file to separate columns
    """
    return



def main():
    parser = argparse.ArgumentParser(description="Simple function allowing to build a json file based on a csv one")
    parser.add_argument("infile",help="Name of the file to transform")
    parser.add_argument("-o","--outfile",help="Name of the output file",type=str,default="out.json")
    parser.add_argument("-s","--separator",help="Token use by the csv file",type=str,default="\t")
    args = parser.parse_args()
    return csvToJson(args.infile,args.outfile,args.separator)

if __name__ == "__main__":
    main()

Если вы попытаетесь получить помощь CLI, вы получите это:

usage: test.py [-h] [-o OUTFILE] [-s SEPARATOR] infile

Simple function allowing to build a json file based on a csv one

positional arguments:
  infile                Name of the file to transform

optional arguments:
  -h, --help            show this help message and exit
  -o OUTFILE, --outfile OUTFILE
                        Name of the output file
  -s SEPARATOR, --separator SEPARATOR
                        Token use by the csv file

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

Чтобы автоматизировать это, начальная точка была модулем Inspect, который содержит функцию с именем «getfullargspec». Эта функция позволяет найти большую часть информации о ваших функциях, например:

  • Количество аргументов и их имен
  • Их типовые аннотации
  • И их значение по умолчанию

Например, в приведенном выше примере эта функция дает использовать эту информацию:

specs = getfullargspec(csvToJson)
print(specs.args)#['infile', 'outfile', 'separator']
print(specs.defaults)#('out.json', '\t')
print(specs.annotations)#{'outfile': , 'separator': }

Настолько совершенен ! У нас уже есть все, что нам нужно для автоматического создания нашего CLI! За исключением названия функции, но вы можете получить ее, используя. имя частные атрибуты функции. И поэтому из этой небольшой функции я строю библиотеку, которая позволяет вам создавать ваш CLI из вашего прототипа функции.

Модуль называется AutoFuncCli, и вы можете получить его через PIP:

pip install autofunccli

Если мы вернемся к нашему примеру, теперь мы можем просто использовать библиотеку для создания нашего CLI:

from autofunccli import cmdfunc

#The cmdfunc function can be use as a decorator.
#It will build a FunctionArgParser object.
@cmdfunc
def csvToJson(infile,outfile:str="out.json",separator:str="\t"):
    """
    Simple function allowing to build a json file based on a csv one
    :param infile: Name of the file to transform
    :param outfile: Name of the output file
    :param separator: Token use by the csv file to separate columns
    """
    return

#You can now use the .main method with the __name__ variable to test if it's
#the main call and in this case, parse the command line arguments and launch the function
csvToJson.main(__name__)

Если вы попытаетесь получить помощь CLI, вы получите это:

usage: test.py [-h] [-o OUTFILE] [-s SEPARATOR] infile

Simple function allowing to build a json file based on a csv one

positional arguments:
  infile                Name of the file to transform : 

optional arguments:
  -h, --help            show this help message and exit
  -o OUTFILE, --outfile OUTFILE
                        Name of the output file : ( )
  -s SEPARATOR, --separator SEPARATOR
                        : (out.json)

[RETURN]

В итоге вы получите почти ту же помощь, что и выше, но с некоторыми различиями, такими как тип каждого аргумента и их значения по умолчанию. Код намного проще читать, и вам не нужно копировать все, что вы уже написали в своих функциональных прототипах. Этот модуль использует аннотации функции, чтобы узнать, как преобразовать строки, например, если вы указали INT в аннотациях, модуль вызовет функцию Int для анализа строки. Конечно, у модуля есть некоторые ограничения, например, вы можете использовать только некоторые типы по умолчанию Python, и у вас также нет такой же гибкости, как и модуль Argparse (например, эксклюзивные аргументы).

Я не рассказал все о AutoFunccli, вы можете создать многофункциональный CLI, использовать вариадические аргументы или даже перечисления! Так что, если вы хотите увидеть больше, обязательно ознакомьтесь с репозиторием:

Cuadrosnicolas/Python-Command-функция

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

Я обнаружил, что этот модуль действительно интересным для создания и многому узнал о модуле Inspect и о том, как вы можете сделать некоторые метапрограммирующие вещи в Python. Об этом модуле есть что сказать, как вы можете автоматизировать некоторые части Python и как вы можете сопряжены этот тип анализа времени выполнения и мета -класс Python.

Если вы хотите узнать больше о модуле Inspect, вы можете проверить Официальная документация Анкет

Я надеюсь, что вам понравилась эта статья и этот модуль, если вы думаете, что мы сможем ее улучшить, расскажите мне в комментариях!

Оригинал: “https://dev.to/cuacua/build-a-small-command-line-utility-by-using-a-python-function-35aa”