Python — regular expressions

Содержание:

Matching Versus Searching

Python offers two different primitive operations based on regular expressions: match checks for a match only at the beginning of the string, while search checks for a match anywhere in the string (this is what Perl does by default).

Example

#!/usr/bin/python
import re

line = "Cats are smarter than dogs";

matchObj = re.match( r'dogs', line, re.M|re.I)
if matchObj:
   print "match --> matchObj.group() : ", matchObj.group()
else:
   print "No match!!"

searchObj = re.search( r'dogs', line, re.M|re.I)
if searchObj:
   print "search --> searchObj.group() : ", searchObj.group()
else:
   print "Nothing found!!"

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

No match!!
search --> searchObj.group() :  dogs

Match object

You can get methods and attributes of a match object using dir() function.

Some of the commonly used methods and attributes of match objects are:

Example 6: Match object

Here, match variable contains a match object.

Our pattern has two subgroups and . You can get the part of the string of these parenthesized subgroups. Here’s how:

match.start(), match.end() and match.span()

The function returns the index of the start of the matched substring. Similarly, returns the end index of the matched substring.

The function returns a tuple containing start and end index of the matched part.

match.re and match.string

The attribute of a matched object returns a regular expression object. Similarly, attribute returns the passed string.

We have covered all commonly used methods defined in the module. If you want to learn more, visit Python 3 re module.

Using r prefix before RegEx

When r or R prefix is used before a regular expression, it means raw string. For example, is a new line whereas means two characters: a backslash followed by .

Backlash is used to escape various characters including all metacharacters. However, using r prefix makes treat as a normal character.

Шаблоны, соответствующие не конкретному тексту, а позиции

Отдельные части регулярного выражения могут соответствовать не части текста, а позиции в этом тексте. То есть такому шаблону соответствует не подстрока, а некоторая позиция в тексте, как бы «между» буквами.

Простые шаблоны, соответствующие позиции

всем текстомвсего текстастрочкой текста

Шаблон Описание Пример Применяем к тексту
Начало всего текста или начало строчки текста,
если
Конец всего текста или конец строчки текста,
если
Строго начало всего текста
Строго конец всего текста
Начало или конец слова (слева пусто или не-буква, справа буква и наоборот) вал, перевал, Перевалка
Не граница слова: либо и слева, и справа буквы,
либо и слева, и справа НЕ буквы
перевал, вал, Перевалка
перевал, вал, Перевалка

Сложные шаблоны, соответствующие позиции (lookaround и Co)

Следующие шаблоны применяются в основном в тех случаях, когда нужно уточнить, что должно идти непосредственно перед или после шаблона, но при этом
не включать найденное в match-объект.

Шаблон Описание Пример Применяем к тексту
lookahead assertion, соответствует каждой
позиции, сразу после которой начинается
соответствие шаблону …
Isaac Asimov, Isaac other
negative lookahead assertion, соответствует
каждой позиции, сразу после которой
НЕ может начинаться шаблон …
Isaac Asimov, Isaac other
positive lookbehind assertion, соответствует
каждой позиции, которой может заканчиваться шаблон …
Длина шаблона должна быть фиксированной,
то есть и — это ОК, а и — нет.
abcdef, bcdef
negative lookbehind assertion, соответствует
каждой позиции, которой НЕ может
заканчиваться шаблон …
abcdef, bcdef

На всякий случай ещё раз. Каждый их этих шаблонов проверяет лишь то, что идёт непосредственно перед позицией или непосредственно после позиции. Если пару таких шаблонов написать рядом, то проверки будут независимы (то есть будут соответствовать AND в каком-то смысле).

lookaround на примере королей и императоров Франции

— Людовик, за которым идёт VI

Шаблон Комментарий Применяем к тексту
Цифра, окружённая не-цифрами Text ABC 123 A1B2C3!
Текст от #START# до #END# text from #START# till #END#
Цифра, после которой идёт ровно одно подчёркивание 12_34__56
Строка, в которой нет boo
(то есть нет такого символа,
перед которым есть boo)
a foo and
boo and zooand others
Строка, в которой нет ни boo, ни foo a foo and
boo and zoo and others

Примеры регулярных выражений

Классы персонажей

примеров описание
ython Matching «Python» или «Python»
руб Матч «Рубин» или «деревенщина»
Любой из букв в скобках соответствия
Соответствует любой цифре. Аналогично
Соответствует любому строчных букв
Соответствует любой верхний регистр
Матчи любые буквы и цифры
В дополнение ко всем, кроме букв символов аеиоу
Соответствующие символы, кроме цифр

Специальные классы символов

примеров описание
, Соответствует любому одному символу, кроме «\ п» есть. Для того, чтобы соответствовать в том числе ‘\ N’, в том числе любые символы, такие, как использование » режим.
\ D Совпадает с цифрой. Эквивалент .
\ D Соответствует не цифровых символов. Это эквивалентно .
\ S Соответствует пробельные символы, включая пробелы, символы табуляции, разрывы страниц, и так далее. Эквивалентно .
\ S Соответствует непробельного символы. Эквивалентно .
\ W Любое слово символ, включая подчеркивание. Это эквивалентно » ‘.
\ W Соответствует любому символу, кроме буквы. Это эквивалентно ».

объектно-ориентированный Python: Предыдущая
Далее: Python CGI программирование

Match Object

A Match Object is an object containing information
about the search and the result.

Note: If there is no match, the value will be
returned, instead of the Match Object.

Example

Do a search that will return a Match Object:

import retxt = «The rain in Spain»x = re.search(«ai»,
txt)
print(x) #this will print an object

The Match object has properties and methods used to retrieve information
about the search, and the result:

returns a tuple containing the start-, and end positions of the match. returns the string passed into the function returns the part of the string where there was a match

Example

Print the position (start- and end-position) of the first match occurrence.

The regular expression looks for any words that starts with an upper case
«S»:

import re
txt = «The rain in Spain»
x = re.search(r»\bS\w+», txt)
print(x.span())

Example

Print the string passed into the function:

import re
txt = «The rain in Spain»
x = re.search(r»\bS\w+», txt)
print(x.string)

Example

Print the part of the string where there was a match.

The regular expression looks for any words that starts with an upper case
«S»:

import re
txt = «The rain in Spain»
x = re.search(r»\bS\w+», txt)
print(x.group())

Note: If there is no match, the value will be
returned, instead of the Match Object.

❮ Previous
Next ❯

Вопросы пользователей по теме Python

Pandas DataFrame Drop 0.000000 значений после .sum ()

Как можно удалить строки со значениями 0.000000 из фрейма данных?
Например:
PassengerId 0.000000
Survived 0.000000
Pclass 0.000000
Name 0.000000
Sex 0.000000
Age 0.198653
SibSp 0.000000
Parch 0.000000
Ticket 0.000000
Fare ….

1 Сен 2021 в 19:20

Какую аннотацию возвращаемого типа использовать, если функция возвращает модуль в Python?

Я пишу функцию, чтобы помочь с необязательной зависимостью (аналогично pytest.importorskip), и я хотел бы ввести его, но не знаю, какой тип использовать. Поскольку я всегда возвращаю определенный модуль или None, я думаю, что могу быть более конкретным, чем «Any».
def try_import_pyarrow():
try:….

1 Сен 2021 в 18:30

Python 3.9.6 — Попытка установить флаг в False. Продолжайте получать ошибку TypeError: ‘<‘ не поддерживается между экземплярами ‘str’ и ‘int’

В приведенном ниже коде я пытаюсь установить флаг «активный» в значение «Ложь». Это не удается. Программа должна прекратить работу, когда возраст «выйдет», но продолжит работу.
Я вижу, что ошибка связана с тем, что я пытаюсь сравнить строку и целое число, но я не знаю, почему программа достигает э….

1 Сен 2021 в 18:21

сделать декоратор Только создатель Контента может управлять им

Я создал два декоратора, чтобы заблокировать кому-либо доступ к определенному контенту, например:
@method_decorator(login_required(login_url=’core:login’), name=’dispatch’)
@method_decorator(allowed_users(allowed_roles=), name=’dispatch’)
class BookDeleteView(BSModalDeleteView):
….

1 Сен 2021 в 18:14

Сохранять только столбцы в Pandas Dataframe на основе нескольких условий

Предположим следующий фрейм данных:
import pandas as pd

data = {‘Name’: ,
‘Height of Person’: ,
‘Qualification’: ,
‘Country is’:
}
df = pd.DataFrame(data)
d….

1 Сен 2021 в 17:45

Экспорт в формат csv Python Dataframe

Фрейм данных Pycharm
У меня есть фрейм данных, который отображается именно так, как я хочу, но когда я использую функцию pandas to_csv, файл csv содержит множество специальных символов, которых нет в pycharm. есть идеи о том, как экспортировать точный формат pycharm df?
экспортированный формат csv….

1 Сен 2021 в 17:30

Как я могу пометить индекс как «используемый» при итерации по списку?

Я буду перебирать list of integers, nums, несколько раз, и каждый раз, когда целое число было «использовано» для чего-то (неважно что), я хочу отметить индекс как используемый. Так что в будущих итерациях я больше не буду использовать это целое число.
Два вопроса:
Моя идея — просто создать отдельны….. 1 Сен 2021 в 17:21

1 Сен 2021 в 17:21

Хранить массив Python в каждой записи столбца

У меня есть массив mutlilabel, который выглядит так:
,
,
,

,
]

И хочу сохранить каждый из этих массивов в моей целевой пе….

1 Сен 2021 в 17:03

Получить значение определенного ключа из файла JSON python

У меня есть файл JSON, содержащий список изменений цен на все криптовалюты Я хочу извлечь все ‘percentage’ для всех монет.
Используя приведенный ниже код, он выдает ошибку TypeError: строковые индексы должны быть целыми числами (что, как я знаю, совершенно неверно, в основном я пытаюсь понять, как ….

1 Сен 2021 в 16:48

Индексирующий массив с массивом на numpy

Это похоже на некоторые вопросы по SO, но я не совсем понимаю, как получить то, что я хочу.
У меня два массива, arr формы (x, y, z) индексы формы (x, y), которые содержат интересующие индексы для z.
Для каждого индексов я хочу получить фактическое значение в arr , где:
arr.x == indexes.x
….

1 Сен 2021 в 16:43

Наборы

Набор — это набор символов в квадратных скобках со специальным значением:

Поставил Описание
Возвращает совпадение, в котором один из указанных символов (a, r или n) являются настоящее время
Возвращает совпадение для любого символа нижнего регистра в алфавитном порядке между а и п
Возвращает совпадение для любого символа, ЗА ИСКЛЮЧЕНИЕМ a, г и п
Возвращает совпадение, в котором любая из указанных цифр (0, 1, 2 или 3) являются настоящее время
Возвращает совпадение для любой цифры между 0 и 9
Возвращает совпадение для любых двузначных чисел от 00 до 59
Возвращает совпадение для любого символа в алфавитном порядке между a и z, нижний регистр ИЛИ верхний регистр
В наборах, +, *, ., |, (), $, {} не имеет особого значения, поэтому означает: вернуть совпадение для любого + символ в строке

Особенности, с которыми вы часто можете столкнуться в повседневной деятельности

1. Использование генератора дважды

Как мы видим в этом примере, использование переменной дважды, дало ожидаемый результат в первом случае, и, для людей незнакомых с Python в достаточной мере, неожиданный результат во втором.

2. Проверка вхождения элемента в генератор

Возьмём всё те же переменные:

А теперь, дважды проверим, входит ли элемент в последовательность:

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

3. Распаковка словаря

Для примера используем простой словарь с двумя элементами:

Распаковываем его:

Результат будет также неочевиден, для людей, не понимающих устройство Python, «под капотом»:

Python 3 курс

Python3 курсPython3 Базовая грамматикаPython3 Основные типы данныхPython3 переводчикPython3 примечаниеPython3 операторыPython3 цифровойPython3 строкаPython3 списокPython3 КортежPython3 словарьPython3 Первый шаг в программированииPython3 условия контроляPython3 LoopsPython3 Итераторы и генераторыPython3 функцияPython3 структура данныхPython3 модульPython3 Ввод и выводPython3 FilePython3 OSPython3 Ошибки и исключенияPython3 Объектно-ориентированныйPython3 Стандартная библиотека ОбзорPython3 примеровPython3 Регулярные выраженияPython3 CGIпрограммаPython3 MySQLPython3 Сетевое программированиеPython3 SMTPОтправить по электронной почтеPython3 МногопоточностьPython3 XMLрешениеPython3 JSONPython3 Дата и время

4.3. The range() Function¶

If you do need to iterate over a sequence of numbers, the built-in function
comes in handy. It generates arithmetic progressions:

>>> for i in range(5):
...     print(i)
...

1
2
3
4

The given end point is never part of the generated sequence; generates
10 values, the legal indices for items of a sequence of length 10. It
is possible to let the range start at another number, or to specify a different
increment (even negative; sometimes this is called the ‘step’):

>>> list(range(5, 10))


>>> list(range(, 10, 3))


>>> list(range(-10, -100, -30))

To iterate over the indices of a sequence, you can combine and
as follows:

>>> a = 'Mary', 'had', 'a', 'little', 'lamb'
>>> for i in range(len(a)):
...     print(i, ai])
...
0 Mary
1 had
2 a
3 little
4 lamb

In most such cases, however, it is convenient to use the
function, see .

A strange thing happens if you just print a range:

>>> range(10)
range(0, 10)

In many ways the object returned by behaves as if it is a list,
but in fact it isn’t. It is an object which returns the successive items of
the desired sequence when you iterate over it, but it doesn’t really make
the list, thus saving space.

We say such an object is , that is, suitable as a target for
functions and constructs that expect something from which they can
obtain successive items until the supply is exhausted. We have seen that
the statement is such a construct, while an example of a function
that takes an iterable is :

>>> sum(range(4))  # 0 + 1 + 2 + 3
6

Протокол итератора

Теперь формализуем протокол итератора целиком:

  1. Чтобы получить итератор мы должны передать функции итерируемый объект.
  2. Далее мы передаём итератор функции .
  3. Когда элементы в итераторе закончились, порождается исключение .

Особенности:

  1. Любой объект, передаваемый функции без исключения — итерируемый объект.
  2. Любой объект, передаваемый функции без исключения — итератор.
  3. Любой объект, передаваемый функции и возвращающий сам себя — итератор.

Плюсы итераторов:

  1. Итераторы работают «лениво» (en. lazy). А это значит, что они не выполняют какой-либо работы, до тех пор, пока мы их об этом не попросим.

  2. Таким образом, мы можем оптимизировать потребление ресурсов ОЗУ и CPU, а так же создавать бесконечные последовательности.

Включение в последовательность

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

Python поддерживает концепцию под названием «включение в последовательность» (от англ. comprehension, в информатике эта операция так же называется описанием последовательности), которая суть изящный способ преобразования одной последовательности в другую. Во время этого процесса элементы могут быть условно включены и преобразованы заданной функцией. Вот один из вариантов общего формата операции включения в список:

В данном общем формате выражение – это выражение или функция с участием переменной, которые возвращают значение, переменная – это элемент последовательности, список – это обрабатываемый список, и выражение2 – это логическое выражение или предикативная функция с участием переменной. Чтобы все стало понятно, приведем простой пример возведения список в квадрат без условия:

Приведенное выше включение в список эквивалентно следующему ниже фрагменту программного кода:

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

В конструкции включения в последовательность используется математическая запись построения последовательности. Такая запись в теории множеств и логике называется определением интенсионала множества и описывает множество путем определения условия, которое должно выполняться для всех его членов. В сущности, в терминах этих областей науки, выполняя данную операцию в Python, мы «описываем интенсионал» соответственно списка, словаря, множества и итерируемой последовательности. Ниже приведены примеры описания интенсионала соответственно списка, словаря, множества и итерируемой последовательности.

Таблица 1. Формы описания интенсионала

Выражение

Описание

Описание списка

Описание словаря

Описание множества

Описание последовательности. Такая форма записи создает генератор последовательности. Генератор – это объект, который можно последовательно обойти (обычно при помощи инструкции ), но чьи значения предоставляются только тогда, когда они требуются, используя ленивое вычисление.

Отметим, что приведенные в таблице выражения (за исключением описания словаря) отличаются только ограничивающими символами: квадратные скобки применяются для описания списка, фигурные скобки – для описания словаря или множества и круглые скобки – для описания итерируемой последовательности.

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

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

(Если бы последовательностей было три, то они объединялись бы в кортежи из трех элементов и т.д.)

Включение в список применено и в приведенном ниже примере вместо функции :

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

Рекомендации по ФП на языке Python

Понятие ФП несколько различается по строгости формулировки. Одни понимают применение только функций, немутируемость и наведение мостов с периферией (вводом-выводом). Другие определяют ФП строже и наряду с немутируемостью говорят о применении только чистых функций. Но в любом случае программирование в функциональном стиле не тождественно функциональному программированию. Применение первоклассных функций, лямбд, итераторов, включений, каррирования и сопоставления с шаблонами вовсе не означает немутируемость и чистые функции.

Что делает функции нечистыми?

  • Глобальные мутации, т.е. внесение изменений в глобальное состояние,

  • Недетерминированность функций, т.е. которые для одинаковых входных значений могут возвращать разные результаты, и

  • Операции ввода-вывода.

Пример глобальной мутации:

Пример недетерминированности:

Пример операции ввода-вывода:

Из чистых функций вытекает ссылочная (референциальная) прозрачность. Говорят, что программа или математическое выражение ссылочно прозрачны, если любое подвыражение можно заменить его значением, и это не приведет к изменению значения целого, т. е. скрытые побочные эффекты отсутствуют. Математические рассуждения, преобразования и доказательства корректности могут быть справедливыми только для выражений, обладающих этим свойством. А программы, написанные на обычных императивных языках, не являются ссылочно прозрачными, так как присваивание значений глобальным переменным, в некоторых случаях и локальным, вызывает скрытые побочные эффекты.

Ссылочная прозрачность (1) улучшает тестопригодность программ, т.е. поведение подпрограмм не зависит от контекста, повторный запуск приложения дает одинаковый результаты как следствие отсутствия мутаций, (2) обеспечивается модульность, т.е. поведение функций не зависит от контекста, и чистые функции можно легко составлять в композиции, строя новые формы поведений, (3) упрощает обеспечение конкурентности из-за отсутствия необходимости в синхронизации, т.к. отсутствие совместных мутируемых данных делает синхронизацию ненужной.

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

В отличие от объектно-ориентированного программирования, которое строит сложные формы поведения с помощью наследования, ФП опирается на композицию функций. Этот принцип перекликается с философией Unix, состоящей из 2 правил:

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

  • Правило модульности — писать простые части, которые можно соединять чистыми интерфейсами.

Указанные выше два простых правила делают ненужными архитектурные шаблоны и принципы ООП, заменяя их функциями! А что, спросите вы, и классы тоже? В Python использование классов не противоречит ФП, если в них отсутствует мутирующие интерфейсы.

Пример класса с мутирующим интерфейсом:

Пример класса без мутирующего интерфейса:

Но лучше использовать замороженные dataclasses и копирование, где необходимо. Иными словами, все классы должны быть замороженными dataclasses.

При всем при этом dataclasses могут быть вполне себе умными!

Также следует использовать сторонние функциональные библиотеки (например, toolz), которые обеспечивают более оптимальную композиционность функций.

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

И применять архитектурный шаблон «немутируемое ядро — мутируемая оболочка» (aka «функциональное ядро — императивная оболочка»), который позволяет выносить мутацию во вне и производить ее на границах приложения.

4.6. Defining Functions¶

We can create a function that writes the Fibonacci series to an arbitrary
boundary:

>>> def fib(n):    # write Fibonacci series up to n
...     """Print a Fibonacci series up to n."""
...     a, b = , 1
...     while a < n
...         print(a, end=' ')
...         a, b = b, a+b
...     print()
...
>>> # Now call the function we just defined:
... fib(2000)
0 1 1 2 3 5 8 13 21 34 55 89 144 233 377 610 987 1597

The keyword introduces a function definition. It must be
followed by the function name and the parenthesized list of formal parameters.
The statements that form the body of the function start at the next line, and
must be indented.

The first statement of the function body can optionally be a string literal;
this string literal is the function’s documentation string, or docstring.
(More about docstrings can be found in the section .)
There are tools which use docstrings to automatically produce online or printed
documentation, or to let the user interactively browse through code; it’s good
practice to include docstrings in code that you write, so make a habit of it.

The execution of a function introduces a new symbol table used for the local
variables of the function. More precisely, all variable assignments in a
function store the value in the local symbol table; whereas variable references
first look in the local symbol table, then in the local symbol tables of
enclosing functions, then in the global symbol table, and finally in the table
of built-in names. Thus, global variables and variables of enclosing functions
cannot be directly assigned a value within a function (unless, for global
variables, named in a statement, or, for variables of enclosing
functions, named in a statement), although they may be
referenced.

The actual parameters (arguments) to a function call are introduced in the local
symbol table of the called function when it is called; thus, arguments are
passed using call by value (where the value is always an object reference,
not the value of the object). When a function calls another function,
or calls itself recursively, a new
local symbol table is created for that call.

A function definition associates the function name with the function object in
the current symbol table. The interpreter recognizes the object pointed to by
that name as a user-defined function. Other names can also point to that same
function object and can also be used to access the function:

>>> fib
<function fib at 10042ed0>
>>> f = fib
>>> f(100)
0 1 1 2 3 5 8 13 21 34 55 89

Coming from other languages, you might object that is not a function but
a procedure since it doesn’t return a value. In fact, even functions without a
statement do return a value, albeit a rather boring one. This
value is called (it’s a built-in name). Writing the value is
normally suppressed by the interpreter if it would be the only value written.
You can see it if you really want to using :

>>> fib()
>>> print(fib())
None

It is simple to write a function that returns a list of the numbers of the
Fibonacci series, instead of printing it:

>>> def fib2(n):  # return Fibonacci series up to n
...     """Return a list containing the Fibonacci series up to n."""
...     result = []
...     a, b = , 1
...     while a < n
...         result.append(a)    # see below
...         a, b = b, a+b
...     return result
...
>>> f100 = fib2(100)    # call it
>>> f100                # write the result

This example, as usual, demonstrates some new Python features:

Строки

Строки в Python обособляются кавычками двойными «»» или одинарными «’». Внутри двойных ковычек могут присутствовать одинарные или наоборот. К примеру строка «Он сказал ‘привет’!» будет выведена на экран как «Он сказал ‘привет’!». Если нужно использовать строку из несколько строчек, то эту строку надо начинать и заканчивать тремя двойными кавычками «»»»». Вы можете подставить в шаблон строки элементы из кортежа или словаря. Знак процента «%» между строкой и кортежем, заменяет в строке символы «%s» на элемент кортежа. Словари позволяют вставлять в строку элемент под заданным индексом. Для этого надо использовать в строке конструкцию «%(индекс)s». В этом случае вместо «%(индекс)s» будет подставлено значение словаря под заданным индексом.

А вот и страдания: аргументы функции и аргументы декоратора

У функции, которую мы декорируем, могут быть аргументы. Принимает их вложенная функция :

А ещё, аргументы могут быть переданы непосредственно в декоратор:

Здесь аргумент передаётся при декорировании в строке №11 и попадает в функцию , строка №1. Таким образом, появился ещё один уровень вложенности только для того, чтобы принять аргументы декоратора.

Вывод:

Пойдём дальше. А что, если декоратор может быть, в одних случаях с аргументами, в других — без аргументов? Поехали!

Вывод:

Как Вам код? Вспомним, мантру Питонистов из начала статьи:

Ничего, на помощь придёт DecoratorHelper! Но, перед этим, ещё пара слов о декораторах.

Добавить комментарий

Ваш адрес email не будет опубликован. Обязательные поля помечены *