Пишем инструменты командной строки на python с помощью click

Default arguments

A default argument is an argument that assumes a default value if a value is not provided in the function call for that argument. The following example gives an idea on default arguments, it prints default age if it is not passed −


#!/usr/bin/python

# Function definition is here
def printinfo( name, age = 35 ):
   "This prints a passed info into this function"
   print "Name: ", name
   print "Age ", age
   return;

# Now you can call printinfo function
printinfo( age=50, name="miki" )
printinfo( name="miki" )

When the above code is executed, it produces the following result −

Name:  miki
Age  50
Name:  miki
Age  35

Using the Python kwargs Variable in Function Definitions

Okay, now you’ve understood what is for, but what about ? works just like , but instead of accepting positional arguments it accepts keyword (or named) arguments. Take the following example:

When you execute the script above, will iterate through the Python kwargs dictionary and concatenate all the values it finds:

Like , is just a name that can be changed to whatever you want. Again, what is important here is the use of the unpacking operator ().

So, the previous example could be written like this:

Note that in the example above the iterable object is a standard . If you iterate over the dictionary and want to return its values, like in the example shown, then you must use .

In fact, if you forget to use this method, you will find yourself iterating through the keys of your Python kwargs dictionary instead, like in the following example:

Now, if you try to execute this example, you’ll notice the following output:

sys.argv

Значение sys.argv – это список аргументов командной строки, которые причастны к скрипту Python. Первый аргумент, argv, имеет аналогичное скрипту Python наименование. В зависимости от платформы, на которой вы работаете, первый аргумент может содержать полный путь к скрипту или к названию файла. Для дополнительных деталей обратитесь к документации. А тем временем, попробуем поработать с парочкой примеров, чтобы познакомиться с этим инструментом:

Python

import sys print(sys.argv) # Ответ:

1 2 3

importsys

print(sys.argv)

# Ответ:

Если вы запустите это в интерпретаторе, вы получите список с пустой строкой. Давайте создадим файл под названием sysargv.py, со следующим содержимым:

Python

import sys

print(sys.argv)

1 2 3

importsys

print(sys.argv)

Теперь запустите код в IDLE. Вы увидите список с одним элементом, который содержит путь к вашему скрипту. Попробуем передать скрипту несколько аргументов. Откройте окно терминала \ консоли и при помощи команды cd измените каталоги на тот, в котором находится скрипт. После этого, запустите что-то наподобие этого:

sys.argv

Обратите внимание на то, что будет выведено на экран:

Python

1

Первый аргумент – это название файла нашего скрипта. Следующие два аргумента в списке – это те, что мы передали нашему скрипту в командной строке.

*args и **kwargs в вызовах функций

*args и **kwargs можно использовать для передачи аргументов в функцию.


Создайте файл some_args.py. Рассмотрим такой код (поместите его в новый файл):

В функции есть три параметра: arg_1, arg_2 и arg_3. Функция выведет каждый из этих аргументов. Затем мы создаем переменную, которой присваивается итерируемый тип (в данном случае кортеж). Эту переменную можно передать в функцию с помощью звездочки.

Запустите программу:

Также можно изменить эту программу и заменить кортеж другим итерируем типом (например, списком). Также нужно объединить * args с именованным параметром:

Запустите программу. Вывод:

Аргументы с ключевым словом ** kwargs могут использоваться для вызова функции аналогичным образом. В файле some_kwargs.py создайте переменную, присвойте ей словарь с тремя парами «ключ-значение» (здесь используется kwargs, но его можно вызывать как угодно) и передайте её функции с тремя аргументами:

Запустите программу:

Ordering Arguments in a Function

Now that you have learned what and are for, you are ready to start writing functions that take a varying number of input arguments. But what if you want to create a function that takes a changeable number of both positional and named arguments?

In this case, you have to bear in mind that order counts. Just as non-default arguments have to precede default arguments, so must come before .

To recap, the correct order for your parameters is:

  1. Standard arguments
  2. arguments
  3. arguments

For example, this function definition is correct:

The variable is appropriately listed before . But what if you try to modify the order of the arguments? For example, consider the following function:

Now, comes before in the function definition. If you try to run this example, you’ll receive an error from the interpreter:

In this case, since comes after , the Python interpreter throws a .

Interpreter Interface

script-ccommand,statementcommand.command

If available, the script name and additional arguments thereafter are passed to the script in the Python variable sys.argv , which is a list of strings (you must first import sys to be able to access it). If no script name is given, sys.argv is an empty string; if -c is used, sys.argv contains the string ‘-c’. Note that options interpreted by the Python interpreter itself are not placed in sys.argv.

In interactive mode, the primary prompt is ‘>>>’; the second prompt (which appears when a command is not complete) is ‘…’. The prompts can be changed by assignment to sys.ps1 or sys.ps2. The interpreter quits when it reads an EOF at a prompt. When an unhandled exception occurs, a stack trace is printed and control returns to the primary prompt; in non-interactive mode, the interpreter exits after printing the stack trace. The interrupt signal raises the KeyboardInterrupt exception; other UNIX signals are not caught (except that SIGPIPE is sometimes ignored, in favor of the IOError exception). Error messages are written to stderr.

Файлы байткода .pyc¶

Импорт модуля – относительно дорогостоящее мероприятие, поэтому Python предпринимает некоторые трюки для ускорения этого процесса. Один из способов – создать байт-компилированные файлы (или байткод) с расширением , которые являются некой промежуточной формой, в которую Python переводит программу (помните раздел “Введение” о том, как работает Python?). Такой файл полезен при импорте модуля в следующий раз в другую программу – это произойдёт намного быстрее, поскольку значительная часть обработки, требуемой при импорте модуля, будет уже проделана. Этот байткод также является платформо-независимым.

Defining a Function

You can define functions to provide the required functionality. Here are simple rules to define a function in Python.

  • Function blocks begin with the keyword def followed by the function name and parentheses ( ( ) ).

  • Any input parameters or arguments should be placed within these parentheses. You can also define parameters inside these parentheses.

  • The first statement of a function can be an optional statement — the documentation string of the function or docstring.

  • The code block within every function starts with a colon (:) and is indented.

  • The statement return exits a function, optionally passing back an expression to the caller. A return statement with no arguments is the same as return None.

Парсим обязательные параметры с click


Простая функция позволяет нам создать CLI с местоположением, указанным пользователем. Это должно работать примерно так:

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

Как нам сделать это при помощи click? Всё довольно просто, мы используем декоратор под названием . Кто бы мог подумать?

Давайте возьмём наш предыдущий пример и слегка изменим его, добавив аргумент :

Если этот выглядит для вас странно, не волнуйтесь — это новый способ форматирования строк в Python 3.6+, который называется f-форматированием.

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

Примечание переводчика Имя аргумента, переданное click, должно совпадать с именем аргумента в объявлении функции.

В нашем случае значение аргумента командной строки будет передано функции в качестве аргумента . Логично, не так ли?

Также вы можете использовать тире в именах, например , которые click переведёт в snake case для имени аргумента в функции, например .

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

Готово!

Calling a Function

Defining a function only gives it a name, specifies the parameters that are to be included in the function and structures the blocks of code.

Once the basic structure of a function is finalized, you can execute it by calling it from another function or directly from the Python prompt. Following is the example to call printme() function −

#!/usr/bin/python

# Function definition is here
def printme( str ):
   "This prints a passed string into this function"
   print str
   return;

# Now you can call printme function
printme("I'm first call to user defined function!")
printme("Again second call to the same function")

When the above code is executed, it produces the following result −

I'm first call to user defined function!
Again second call to the same function

Should a Line Break Before or After a Binary Operator?

For decades the recommended style was to break after binary operators. But this can hurt readability in two ways: the operators tend to get scattered across different columns on the screen, and each operator is moved away from its operand and onto the previous line. Here, the eye has to do extra work to tell which items are added and which are subtracted:

# Wrong:
# operators sit far away from their operands
income = (gross_wages +
          taxable_interest +
          (dividends - qualified_dividends) -
          ira_deduction -
          student_loan_interest)

To solve this readability problem, mathematicians and their publishers follow the opposite convention. Donald Knuth explains the traditional rule in his Computers and Typesetting series: «Although formulas within a paragraph always break after binary operations and relations, displayed formulas always break before binary operations» .

Following the tradition from mathematics usually results in more readable code:

# Correct:
# easy to match operators with operands
income = (gross_wages
          + taxable_interest
          + (dividends - qualified_dividends)
          - ira_deduction
          - student_loan_interest)

Associating Python with .py and .pyc

Verify that double-clicking on ApplyRE.py runs it. (It should also have a Python logo as its icon and be labeled «Python File», by the way.) If this isn’t already done, right-click on a .py file, choose Open With, Choose Program, and check «Always use…» This association improves convenience but isn’t strictly necessary—you can specify «python» every time you want to run a script, like this:

Here’s a very specific variation, which is optional unless you need to specify a different version of the interpreter.

But that’s a pain. Fortunately, once Python is installed, in the PATH, and associated with .py, then double-clicking a .py file or directly typing it as a command should work fine. Here, we seem to be running the script directly—it’s nice and simple to run it on a sample file that’s located in the «my scripts» folder along with the script.

sys.path

Значение функции path модуля sys – это список строк, которые указывают путь поиска для модулей. Как правило, данная функция указывает Python, в каких локациях смотреть, когда он пытается импортировать модуль. В соответствии с документацией Python, sys.path инициализируется из переменной окружения PYTHONPATH, плюс зависимое от установки значение, указанное по умолчанию. Давайте взглянем на пример:

Python

import sys print(sys.path)

1 2

importsys

print(sys.path)


Результат:

Python

1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16

»,

‘C:\\Python27\\Lib\\idlelib’,

‘C:\\Python27\\lib\\site-packages\\setuptools-0.9.5-py2.7.egg’,

‘C:\\Python27\\lib\\site-packages\\pip-1.3.1-py2.7.egg’,

‘C:\\Python27\\lib\\site-packages\\sphinx-1.2b3-py2.7.egg’,

‘C:\\Python27\\lib\\site-packages\\docutils-0.11-py2.7.egg’,

‘C:\\Python27\\lib\\site-packages\\pygments-1.6-py2.7.egg’,

‘C:\\Windows\\system32\\python27.zip’,

‘C:\\Python27\\DLLs’,

‘C:\\Python27\\lib’,

‘C:\\Python27\\lib\\plat-win’,

‘C:\\Python27\\lib\\lib-tk’,

‘C:\\Python27’,

‘C:\\Python27\\lib\\site-packages’,

‘C:\\Python27\\lib\\site-packages\\PIL’,

‘C:\\Python27\\lib\\site-packages\\wx-2.9.4-msw’

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

Python

sys.path.append(«/path/to/my/module»)

1 sys.path.append(«/path/to/my/module»)

Удаление пути я оставлю как задание для читателя

Related

  • Tutorial

    We can use the built-in function map() to apply a function to each item in an iterable (like a list or dictionary) and return a new iterator for retrieving the results. In this tutorial, we’ll review three different ways of working with map(): with a lambda function, with a user-defined function, and finally with a built-in function using multiple iterable arguments.

  • Tutorial

    Since Node.js instances create a single process with a single thread, JavaScript operations that take a long time to run can sometimes block the execution of other code. A key strategy to work around this problem is to launch a child process to run multiple processes concurrently. In this tutorial, you will use the child_process module to create child processes while executing a series of sample Node.js applications.

  • Tutorial

    Arrow functions are a new way to write anonymous function expressions in JavaScript, and are similar to lambda functions in some other programming languages like Python. They differ from traditional functions in the way their scope is determined and how their syntax is expressed, and are particularly useful when passing a function as a parameter to a higher-order function, like an array iterator method. In this article, you will find examples of arrow function behavior and syntax.

  • Tutorial
    How To Use subprocess to Run External Programs in Python 3

    Python 3’s subprocess module can be used to run external programs and read their outputs in your Python code. subprocess includes several classes and functions, but in this tutorial we’ll cover one of subprocess’s most useful functions: subprocess.run. We’ll review its different uses and main keyword arguments.

Создание собственных модулей¶

Создать собственный модуль очень легко. Да вы всё время делали это! Ведь каждая программа на Python также является и модулем. Необходимо лишь убедиться, что у неё установлено расширение . Следующий пример объяснит это.

Пример: (сохраните как )

def sayhi():
    print('Привет! Это говорит мой модуль.')

__version__ = '0.1'

# Конец модуля mymodule.py

Выше приведён простой модуль. Как видно, в нём нет ничего особенного по сравнению с обычной программой на Python. Далее посмотрим, как использовать этот модуль в других наших программах.

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

Ещё один модуль (сохраните как ):

import mymodule

mymodule.sayhi()
print ('Версия', mymodule.__version__)

Вывод:

$ python mymodule_demo.py
Привет! Это говорит мой модуль.
Версия 0.1

Как это работает:

Вот версия, использующая синтаксис (сохраните как ):

from mymodule import sayhi, __version__

sayhi()
print('Версия', __version__)

Вывод такой же, как и .

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

Вы могли бы также использовать:

from mymodule import *

Это импортирует все публичные имена, такие как , но не импортирует , потому что оно начинается с двойного подчёркивания

Variable-length arguments

You may need to process a function for more arguments than you specified while defining the function. These arguments are called variable-length arguments and are not named in the function definition, unlike required and default arguments.

Syntax for a function with non-keyword variable arguments is this −

def functionname( *var_args_tuple ):
   "function_docstring"
   function_suite
   return 

An asterisk (*) is placed before the variable name that holds the values of all nonkeyword variable arguments. This tuple remains empty if no additional arguments are specified during the function call. Following is a simple example −

#!/usr/bin/python

# Function definition is here
def printinfo( arg1, *vartuple ):
   "This prints a variable passed arguments"
   print "Output is: "
   print arg1
   for var in vartuple:
      print var
   return;

# Now you can call printinfo function
printinfo( 10 )
printinfo( 70, 60, 50 )

When the above code is executed, it produces the following result −

Output is:
10
Output is:
70
60
50

Python NumPy

NumPy IntroNumPy Getting StartedNumPy Creating ArraysNumPy Array IndexingNumPy Array SlicingNumPy Data TypesNumPy Copy vs ViewNumPy Array ShapeNumPy Array ReshapeNumPy Array IteratingNumPy Array JoinNumPy Array SplitNumPy Array SearchNumPy Array SortNumPy Array FilterNumPy Random Random Intro Data Distribution Random Permutation Seaborn Module Normal Distribution Binomial Distribution Poisson Distribution Uniform Distribution Logistic Distribution Multinomial Distribution Exponential Distribution Chi Square Distribution Rayleigh Distribution Pareto Distribution Zipf Distribution

NumPy ufunc ufunc Intro ufunc Create Function ufunc Simple Arithmetic ufunc Rounding Decimals ufunc Logs ufunc Summations ufunc Products ufunc Differences ufunc Finding LCM ufunc Finding GCD ufunc Trigonometric ufunc Hyperbolic ufunc Set Operations


С этим читают