Всем привет ! Я французский студент в области компьютерных наук, и сегодня я расскажу о модуле, который я создал, чтобы автоматизировать генерацию 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”