SlideShare a Scribd company logo
«Модифицируй это!»
или
«Больше магии Python с помощью
изменения AST»
Маршалов Александр (@amper)
mail: _@marshalov.org
1
Часть I
Немного теории… *
2
Часть I
Немного теории… *
* на самом деле много…
3
Полный путь программы от
исходного кода до
исполнения
4
Исходный
код
5
Исходный
код
Лексический
анализатор
(lexer)
6
Лексический
анализатор
(lexer)
Например, выражение
test = a + b
в результате лексического анализа превращается в
следующий набор токенов:
[‘test’, ‘=’, ‘a’, ‘+’, ‘b’]
7
Исходный
код
Лексический
анализатор
(lexer)
8
Исходный
код
Лексический
анализатор
(lexer)
Список
токенов
9
Исходный
код
Лексический
анализатор
(lexer)
Список
токенов
Синтаксический
анализатор
(parser)
10
Например, для всё того же выражения получаем:
Синтаксический
анализатор
(parser)
test = a + b
=
test
b
+
a
11
Исходный
код
Лексический
анализатор
(lexer)
Список
токенов
Синтаксический
анализатор
(parser)
12
Исходный
код
Лексический
анализатор
(lexer)
Список
токенов
Синтаксический
анализатор
(parser)
Дерево разбора
(Parse Tree /
CST)
13
Исходный
код
Лексический
анализатор
(lexer)
Список
токенов
Синтаксический
анализатор
(parser)
Дерево разбора
(Parse Tree /
CST)
Абстрактное
синтаксическое
дерево (AST)
14
Исходный
код
Лексический
анализатор
(lexer)
Список
токенов
Синтаксический
анализатор
(parser)
Дерево разбора
(Parse Tree /
CST)
Абстрактное
синтаксическое
дерево (AST)
Граф потока
управления
(CFG)
15
Исходный
код
Лексический
анализатор
(lexer)
Список
токенов
Синтаксический
анализатор
(parser)
Дерево разбора
(Parse Tree /
CST)
Абстрактное
синтаксическое
дерево (AST)
Граф потока
управления
(CFG)
Внутреннее
представление
(IR)
16
Исходный
код
Лексический
анализатор
(lexer)
Список
токенов
Синтаксический
анализатор
(parser)
Дерево разбора
(Parse Tree /
CST)
Абстрактное
синтаксическое
дерево (AST)
Граф потока
управления
(CFG)
Внутреннее
представление
(IR)
Бинарный код /
Байт-код
17
Исходный
код
Лексический
анализатор
(lexer)
Список
токенов
Синтаксический
анализатор
(parser)
Дерево разбора
(Parse Tree /
CST)
Абстрактное
синтаксическое
дерево (AST)
Граф потока
управления
(CFG)
Внутреннее
представление
(IR)
Бинарный код /
Байт-код
Исполнение
18
Исходный
код
Лексический
анализатор
(lexer)
Список
токенов
Синтаксический
анализатор
(parser)
Дерево разбора
(Parse Tree /
CST)
Абстрактное
синтаксическое
дерево (AST)
Граф потока
управления
(CFG)
Внутреннее
представление
(IR)
Бинарный код /
Байт-код
Исполнение
19
Как это выглядит для
Python?
20
Подробно описано в документе:
https://docs.python.org/devguide/compiler.html
либо в PEP 0339 - «Design of the CPython Compiler»
21
Исходный
код (*.py)
22
Исходный
код (*.py)
Дерево разбора
(Parse Tree)
23
Исходный
код (*.py)
Дерево разбора
(Parse Tree)
Абстрактное
синтаксическое
дерево (AST)
24
Исходный
код (*.py)
Дерево разбора
(Parse Tree)
Абстрактное
синтаксическое
дерево (AST)
Граф потока
управления
(CFG)
25
Исходный
код (*.py)
Дерево разбора
(Parse Tree)
Абстрактное
синтаксическое
дерево (AST)
Граф потока
управления
(CFG)
Байт-код
26
Исходный
код (*.py)
Дерево разбора
(Parse Tree)
Абстрактное
синтаксическое
дерево (AST)
Граф потока
управления
(CFG)
Байт-код
27
Python/compile.c
Исходный
код (*.py)
Дерево разбора
(Parse Tree)
Абстрактное
синтаксическое
дерево (AST)
Граф потока
управления
(CFG)
Байт-код
Parser/pgen.c
Python/ast.c
Python/compile.c
28
Python/compile.c
Python/compile.c
Parser/pgen.c
Исходный
код (*.py)
Дерево разбора
(Parse Tree)
Абстрактное
синтаксическое
дерево (AST)
Граф потока
управления
(CFG)
Байт-код
Python/ast.c
29
Python/compile.c
Python/compile.c
Parser/pgen.c
Исходный
код (*.py)
Дерево разбора
(Parse Tree)
Абстрактное
синтаксическое
дерево (AST)
Граф потока
управления
(CFG)
Байт-код
Python/ast.c
30
Дерево разбора
(Parse Tree)
Абстрактное
синтаксическое
дерево (AST)
VS
31
Дерево разбора
(Parse Tree)
Абстрактное
синтаксическое
дерево (AST)
VS
32
Дерево разбора
(Parse Tree)
Абстрактное
синтаксическое
дерево (AST)
VS
Этап формирования AST (и модуль ast) появился,
начиная с версии Python 2.5, до этого компиляция в
байт-код происходила на основе Parse Tree.
33
Часть II
Знакомство с AST
35
Структура языка Python
36
Структура языка Python
Описана на языке Zephyr ASDL в файле «Parser/Python.asdl».
37
Структура языка Python
Описана на языке Zephyr ASDL в файле «Parser/Python.asdl».
Язык ASDL (Abstract Syntax Definition Language) представляет из
себя простой формальный язык для описания синтаксической
структуры языка программирования.
38
Структура языка Python
Описана на языке Zephyr ASDL в файле «Parser/Python.asdl».
Язык ASDL (Abstract Syntax Definition Language) представляет из
себя простой формальный язык для описания синтаксической
структуры языка программирования.
Описание языка ASDL:
ftp://ftp.cs.princeton.edu/techreports/1997/554.pdf
39
Структура языка Python
Описана на языке Zephyr ASDL в файле «Parser/Python.asdl».
Язык ASDL (Abstract Syntax Definition Language) представляет из
себя простой формальный язык для описания синтаксической
структуры языка программирования.
Описание языка ASDL:
ftp://ftp.cs.princeton.edu/techreports/1997/554.pdf
Пример Python.asdl:
http://svn.python.org/projects/python/tags/r32/Parser/Python.asdl
40
Модуль ast
41
Модуль ast
- Является стандартным (встроенным) модулем Python
42
Модуль ast
- Является стандартным (встроенным) модулем Python
- Состоит из двух частей:
43
Модуль ast
- Является стандартным (встроенным) модулем Python
- Состоит из двух частей:
- Модуль на языке C (Python/Python-ast.c),
который можно импортировать с помощью:
import _ast
44
Модуль ast
- Является стандартным (встроенным) модулем Python
- Состоит из двух частей:
- Модуль на языке C (Python/Python-ast.c),
который можно импортировать с помощью:
import _ast
- Модуль на Python (Lib/ast.py), который можно
импортировать с помощью:
import ast
45
Модуль ast
Что содержит?
46
Модуль ast
Что содержит?
47
Модуль ast
- AST
48
Модуль ast
- AST - родительский класс для всех видов узлов в
абстрактном синтаксическом дереве.
49
Модуль ast
- AST - родительский класс для всех видов узлов в
абстрактном синтаксическом дереве.
- Add, And, Assert, Assign, …, For, FunctionDef, …, If,
IfExp, Import, ImportFrom, In, Index, …, While, With,
Yield, YieldFrom
50
Модуль ast
- AST - родительский класс для всех видов узлов в
абстрактном синтаксическом дереве.
- Add, And, Assert, Assign, …, For, FunctionDef, …, If,
IfExp, Import, ImportFrom, In, Index, …, While, With,
Yield, YieldFrom - классы, соответствующие
конкретным типам узлов в абстрактном
синтаксическом дереве.
51
Модуль ast
- AST - родительский класс для всех видов узлов в
абстрактном синтаксическом дереве.
- Add, And, Assert, Assign, …, For, FunctionDef, …, If,
IfExp, Import, ImportFrom, In, Index, …, While, With,
Yield, YieldFrom - классы, соответствующие
конкретным типам узлов в абстрактном
синтаксическом дереве.
- NodeVisitor
52
Модуль ast
- AST - родительский класс для всех видов узлов в
абстрактном синтаксическом дереве.
- Add, And, Assert, Assign, …, For, FunctionDef, …, If,
IfExp, Import, ImportFrom, In, Index, …, While, With,
Yield, YieldFrom - классы, соответствующие
конкретным типам узлов в абстрактном
синтаксическом дереве.
- NodeVisitor - класс для рекурсивного обхода
абстрактного синтаксического дерева.
53
Модуль ast
- AST - родительский класс для всех видов узлов в
абстрактном синтаксическом дереве.
- Add, And, Assert, Assign, …, For, FunctionDef, …, If,
IfExp, Import, ImportFrom, In, Index, …, While, With,
Yield, YieldFrom - классы, соответствующие
конкретным типам узлов в абстрактном
синтаксическом дереве.
- NodeVisitor - класс для рекурсивного обхода
абстрактного синтаксического дерева.
- NodeTransformer
54
Модуль ast
- AST - родительский класс для всех видов узлов в
абстрактном синтаксическом дереве.
- Add, And, Assert, Assign, …, For, FunctionDef, …, If,
IfExp, Import, ImportFrom, In, Index, …, While, With,
Yield, YieldFrom - классы, соответствующие
конкретным типам узлов в абстрактном
синтаксическом дереве.
- NodeVisitor - класс для рекурсивного обхода
абстрактного синтаксического дерева.
- NodeTransformer - класс для рекурсивного изменения
абстрактного синтаксического дерева.
55
Модуль ast
- AST - родительский класс для всех видов узлов в
абстрактном синтаксическом дереве.
- Add, And, Assert, Assign, …, For, FunctionDef, …, If,
IfExp, Import, ImportFrom, In, Index, …, While, With,
Yield, YieldFrom - классы, соответствующие
конкретным типам узлов в абстрактном
синтаксическом дереве.
- NodeVisitor - класс для рекурсивного обхода
абстрактного синтаксического дерева.
- NodeTransformer - класс для рекурсивного изменения
абстрактного синтаксического дерева.
56
Модуль ast
- а так же набор функций, среди которых нам
интересны:
57
Модуль ast
- а так же набор функций, среди которых нам
интересны:
- parse -
58
Модуль ast
- а так же набор функций, среди которых нам
интересны:
- parse - преобразование исходного кода в AST.
59
Модуль ast
- а так же набор функций, среди которых нам
интересны:
- parse - преобразование исходного кода в AST.
- copy_location -
60
Модуль ast
- а так же набор функций, среди которых нам
интересны:
- parse - преобразование исходного кода в AST.
- copy_location - копирование позиции в коде с
одного узла AST в другой.
61
Модуль ast
- а так же набор функций, среди которых нам
интересны:
- parse - преобразование исходного кода в AST.
- copy_location - копирование позиции в коде с
одного узла AST в другой.
- fix_missing_locations -
62
Модуль ast
- а так же набор функций, среди которых нам
интересны:
- parse - преобразование исходного кода в AST.
- copy_location - копирование позиции в коде с
одного узла AST в другой.
- fix_missing_locations - рекурсивно проставляет
позиции в коде из родительских в дочерние узлы
там, где они не проставлены.
63
Модуль ast
- а так же набор функций, среди которых нам
интересны:
- parse - преобразование исходного кода в AST.
- copy_location - копирование позиции в коде с
одного узла AST в другой.
- fix_missing_locations - рекурсивно проставляет
позиции в коде из родительских в дочерние узлы
там, где они не проставлены.
- dump -
64
Модуль ast
- а так же набор функций, среди которых нам
интересны:
- parse - преобразование исходного кода в AST.
- copy_location - копирование позиции в коде с
одного узла AST в другой.
- fix_missing_locations - рекурсивно проставляет
позиции в коде из родительских в дочерние узлы
там, где они не проставлены.
- dump - преобразование AST в текстовый вид
(например, для отладочного вывода).
65
Модуль ast
- а так же набор функций, среди которых нам
интересны:
- parse - преобразование исходного кода в AST.
- copy_location - копирование позиции в коде с
одного узла AST в другой.
- fix_missing_locations - рекурсивно проставляет
позиции в коде из родительских в дочерние узлы
там, где они не проставлены.
- dump - преобразование AST в текстовый вид
(например, для отладочного вывода).
- increment_lineno -
66
Модуль ast
- а так же набор функций, среди которых нам
интересны:
- parse - преобразование исходного кода в AST.
- copy_location - копирование позиции в коде с
одного узла AST в другой.
- fix_missing_locations - рекурсивно проставляет
позиции в коде из родительских в дочерние узлы
там, где они не проставлены.
- dump - преобразование AST в текстовый вид
(например, для отладочного вывода).
- increment_lineno - увеличение номера строки для
переданного узла (например, при вставке новых
узлов). 67
Модуль ast
- а так же набор функций, среди которых нам
интересны:
- parse - преобразование исходного кода в AST.
- copy_location - копирование позиции в коде с
одного узла AST в другой.
- fix_missing_locations - рекурсивно проставляет
позиции в коде из родительских в дочерние узлы
там, где они не проставлены.
- dump - преобразование AST в текстовый вид
(например, для отладочного вывода).
- increment_lineno - увеличение номера строки для
переданного узла (например, при вставке новых
узлов). 68
Часть III
Которая меняет «всё»
70
Как все «обернуть»?
71
Как все «обернуть»?
1. Декораторы
72
Как все «обернуть»?
1. Декораторы (функций или классов)
73
Как все «обернуть»?
1. Декораторы (функций или классов)
74
Как все «обернуть»?
1. Декораторы (функций или классов)
2. Импорт-хуки
75
Этапы трансформации
1. Получаем код и AST
76
Этапы трансформации
1. Получаем код и AST
77
Этапы трансформации
1. Получаем код и AST
78
Этапы трансформации
1. Получаем код и AST
79
Этапы трансформации
1. Получаем код и AST
<_ast.Module object at 0x10ca53e80>
Module
( body = [ FunctionDef
( name = 'my_function'
, args = arguments( args = [arg('a'), arg('b'), arg('c')] )
, body = [ Return
( value = BinOp
( left = BinOp
( left = Name('a')
, op = Add()
, right = Name('b')
)
, op = Add()
, right = Name('c')
)
)
]
)
]
)
80
Этапы трансформации
2. Модифицируем AST
81
Этапы трансформации
2. Модифицируем AST. Пример 1 - изменение узла.
82
Этапы трансформации
2. Модифицируем AST. Пример 1 - изменение узла.
83
Этапы трансформации
2. Модифицируем AST. Пример 2 - удаление узла.
84
Этапы трансформации
2. Модифицируем AST. Пример 2 - удаление узла.
85
Этапы трансформации
2. Модифицируем AST. Пример 3 - вставка узла.
86
Этапы трансформации
2. Модифицируем AST. Пример 3 - вставка узла.
87
Этапы трансформации
2. Модифицируем AST
А что делать с классом-трансформером?
88
Этапы трансформации
2. Модифицируем AST
89
Этапы трансформации
2. Модифицируем AST
90
Этапы трансформации
3. Компилируем AST и подменяем код
91
Этапы трансформации
3. Компилируем AST и подменяем код
92
Этапы трансформации
3. Компилируем AST и подменяем код
93
Этапы трансформации
Декоратор
94
Этапы трансформации
Декоратор
95
Этапы трансформации
Декоратор
96
Часть IV
А что мы можем
98
Внимание!
Не повторяйте это дома
в продакшн! *
99
Внимание!
Не повторяйте это дома
в продакшн! *
** Если вы не полностью понимаете, как именно это
работает
100
Внимание!
Не повторяйте это дома
в продакшн! *
** Если вы не полностью понимаете, как именно это
работает **
** или если понимаете и это вас пугает
101
Почему нужно быть
осторожным?
102
Почему нужно быть
осторожным?
Возможные последствия
103
Почему нужно быть
осторожным?
- Глюки отладки
Возможные последствия
104
Почему нужно быть
осторожным?
- Глюки отладки
- Возможность некорректной работы при «наложениях»
различных модификаций AST
Возможные последствия
105
Почему нужно быть
осторожным?
- Глюки отладки
- Возможность некорректной работы при «наложениях»
различных модификаций AST
- Странные ошибки
Возможные последствия
106
Почему нужно быть
осторожным?
- Глюки отладки
- Возможность некорректной работы при «наложениях»
различных модификаций AST
- Странные ошибки
- Зависимость от версии интерпретатора
Возможные последствия
107
Пример 1. Константы
Применяем оптимизацию Constant Propagation (распространение
констант).
108
Пример 1. Константы
Применяем оптимизацию Constant Propagation (распространение
констант).
То есть заменяем все обращения к «константным переменным»
на значения этих переменных.
109
Пример 1. Константы
Применяем оптимизацию Constant Propagation (распространение
констант).
То есть заменяем все обращения к «константным переменным»
на значения этих переменных.
Соответственно, для таких обращений не происходит поиска в
locals и globals и зачитывания значений переменной.
110
Пример 1. Константы
Применяем оптимизацию Constant Propagation (распространение
констант).
То есть заменяем все обращения к «константным переменным»
на значения этих переменных.
Соответственно, для таких обращений не происходит поиска в
locals и globals и зачитывания значений переменной.
Если в коде используется множество констант, то такая
оптимизация даст неплохой прирост скорости.
111
Пример 1. Константы
Применяем оптимизацию Constant Propagation (распространение
констант).
То есть заменяем все обращения к «константным переменным»
на значения этих переменных.
Соответственно, для таких обращений не происходит поиска в
locals и globals и зачитывания значений переменной.
Если в коде используется множество констант, то такая
оптимизация даст неплохой прирост скорости.
Источник идеи: http://blaag.haard.se/Using-the-AST-to-hack-
constants-into-Python/
112
113
Пример 1. Константы
114
Пример 1. Константы
115
Пример 1. Константы
Продолжая идею можно выполнять так же и Constant Folding
«свертку констант», но алгоритм будет более сложным.
116
Пример 2. Автологгер
Смысл «трансформации» в добавлении логирования к
необходимым событиям
117
Пример 2. Автологгер
Смысл «трансформации» в добавлении логирования к
необходимым событиям, например:
- вызов и возврат функции / метода (с выводом параметро
и результата
118
Пример 2. Автологгер
Смысл «трансформации» в добавлении логирования к
необходимым событиям, например:
- вызов и возврат функции / метода (с выводом параметро
и результата
- присвоение значения переменной
119
Пример 2. Автологгер
Смысл «трансформации» в добавлении логирования к
необходимым событиям, например:
- вызов и возврат функции / метода (с выводом параметро
и результата
- присвоение значения переменной
- импорте модуля
120
Пример 2. Автологгер
Смысл «трансформации» в добавлении логирования к
необходимым событиям, например:
- вызов и возврат функции / метода (с выводом параметро
и результата
- присвоение значения переменной
- импорте модуля
- и т.д.
121
Пример 3. Автопрофайлер
Идея та же, что и в автологгере, но при этом выполняется
засечки «до» и «после» каждого события и замеряется
время выполнения, например, работы каждой функции.
122
Пример 4. Макросы
123
Пример 4. Макросы
Проект karnickel
124
Пример 4. Макросы
Проект karnickel
www.pocoo.org/projects/karnickel/
125
Пример 4. Макросы
Проект karnickel
126
Пример 4. Макросы
Проект karnickel
127
Пример 5. Расширение возможностей
языка
128
Пример 5. Расширение возможностей
языка
Для начала вспомним, в какой момент
формируется AST…
129
Пример 5. Расширение возможностей
языка
Для начала вспомним, в какой момент
формируется AST…
…Всякая хрень,
о которой все
уже забыли…
130
Пример 5. Расширение возможностей
языка
Для начала вспомним, в какой момент
формируется AST…
…Всякая хрень,
о которой все
уже забыли…
Синтаксический
анализатор
(parser)
131
Пример 5. Расширение возможностей
языка
Для начала вспомним, в какой момент
формируется AST…
…Всякая хрень,
о которой все
уже забыли…
Синтаксический
анализатор
(parser)
AST
132
Пример 5. Расширение возможностей
языка
Для начала вспомним, в какой момент
формируется AST…
…Всякая хрень,
о которой все
уже забыли…
Синтаксический
анализатор
(parser)
AST
…ещё
какая-то
хрень…
133
Пример 5. Расширение возможностей
языка
Для начала вспомним, в какой момент
формируется AST…
…Всякая хрень,
о которой все
уже забыли…
Синтаксический
анализатор
(parser)
AST
…ещё
какая-то
хрень…
Компиляция
в байт-код
134
Пример 5. Расширение возможностей
языка
Для начала вспомним, в какой момент
формируется AST…
Синтаксический
анализатор
(parser)
AST
Компиляция
в байт-код
135
Пример 5. Расширение возможностей
языка
Практически любая синтаксически верная
конструкция на языке Python с помощью
модификации AST может быть превращена в
компилируемый семантически верный код.
136
Пример 5. Расширение возможностей
языка
Пример 5. Расширение возможностей
языка
Проект MacroPy
138
Проект MacroPy
https://github.com/lihaoyi/macropy
Пример 5. Расширение возможностей
языка
139
Проект MacroPy
Пример 5. Расширение возможностей
языка
140
Проект MacroPy
Пример 5. Расширение возможностей
языка
141
Проект MacroPy
Пример 5. Расширение возможностей
языка
142
Проект MacroPy
Пример 5. Расширение возможностей
языка
143
Проект MacroPy
Пример 5. Расширение возможностей
языка
144
Проект Pony ORM
Пример 5. Расширение возможностей
языка
146
Проект Pony ORM
https://ponyorm.com
Пример 5. Расширение возможностей
языка
147
Ещё…
148
Оптимизация,
Кодогенерация,
Создание DSL,
Расширение возможностей языка,
Ленивые вычисления,
Паттерн-матчинг,
и многое другое…
Инструменты
149
Инструменты
astdump
https://bitbucket.org/techtonik/astdump
150
Инструменты
astviewer
https://github.com/titusjan/astviewer
151
Инструменты
ast_tool_box
https://github.com/ucb-sejits/ast_tool_box
Ссылки
Design of CPython’s Compiler:
https://docs.python.org/devguide/compiler.html
https://www.python.org/dev/peps/pep-0339/
Green Tree Snakes - the missing Python AST docs
http://greentreesnakes.readthedocs.org
http://bitbucket.org/takluyver/greentreesnakes/src
153
Импорт в Питоне
http://asvetlov.blogspot.ru/2010/05/blog-post.html
http://asvetlov.blogspot.ru/2010/05/2.html
http://asvetlov.blogspot.ru/2010/05/3.html
https://docs.python.org/3/reference/import.html
https://www.python.org/dev/peps/pep-0302/
Ссылки
154
Instrumenting the AST:
http://www.dalkescientific.com/writings/diary/archive/2010/02/22/
instrumenting_the_ast.html
Using the AST to hack constants into Python:
blaag.haard.se/Using-the-AST-to-hack-constants-into-Python/
The Zephyr Abstract Syntax Description Language:
ftp://ftp.cs.princeton.edu/techreports/1997/554.pdf
Abstract Syntax Trees:
https://docs.python.org/3/library/ast.html
Hacking Python AST: checking methods declaration:
https://julien.danjou.info/blog/2015/python-ast-checking-method-
declaration
Спасибо за внимание
Вопросы,
пожелания,
предложения,
замечания,
угрозы?
можно присылать на почту _@marshalov.org
155

More Related Content

What's hot

Python&Printer / Андрей Пучко / penta.by
Python&Printer / Андрей Пучко / penta.byPython&Printer / Андрей Пучко / penta.by
Python&Printer / Андрей Пучко / penta.by
Python Meetup
 
Быстрые конструкции в Python - Олег Шидловский, Python Meetup 26.09.2014
Быстрые конструкции в Python - Олег Шидловский, Python Meetup 26.09.2014Быстрые конструкции в Python - Олег Шидловский, Python Meetup 26.09.2014
Быстрые конструкции в Python - Олег Шидловский, Python Meetup 26.09.2014
Python Meetup
 
Почему Rust стоит вашего внимания
Почему Rust стоит вашего вниманияПочему Rust стоит вашего внимания
Почему Rust стоит вашего внимания
Michael Pankov
 
Мир Python функционалим с помощью библиотек
Мир Python  функционалим с помощью библиотекМир Python  функционалим с помощью библиотек
Мир Python функционалим с помощью библиотек
PyNSK
 
Сладкое будущее: Phalcon и Zephir
Сладкое будущее: Phalcon и ZephirСладкое будущее: Phalcon и Zephir
Сладкое будущее: Phalcon и Zephir
CodeFest
 
Опыт применения активных объектов во встраиваемых системах. Архитектурные асп...
Опыт применения активных объектов во встраиваемых системах. Архитектурные асп...Опыт применения активных объектов во встраиваемых системах. Архитектурные асп...
Опыт применения активных объектов во встраиваемых системах. Архитектурные асп...
Sigma Software
 
Для чего мы делали свой акторный фреймворк и что из этого вышло?
Для чего мы делали свой акторный фреймворк и что из этого вышло?Для чего мы делали свой акторный фреймворк и что из этого вышло?
Для чего мы делали свой акторный фреймворк и что из этого вышло?
Yauheni Akhotnikau
 
Александр Фокин, Рефлексия в C++
Александр Фокин, Рефлексия в C++Александр Фокин, Рефлексия в C++
Александр Фокин, Рефлексия в C++
Sergey Platonov
 
Python и Cython
Python и CythonPython и Cython
Python и Cython
Alexander Shigin
 
Полухин Антон, Как делать не надо: C++ велосипедостроение для профессионалов
Полухин Антон, Как делать не надо: C++ велосипедостроение для профессионаловПолухин Антон, Как делать не надо: C++ велосипедостроение для профессионалов
Полухин Антон, Как делать не надо: C++ велосипедостроение для профессионалов
Sergey Platonov
 
Борис Сазонов, RAII потоки и CancellationToken в C++
Борис Сазонов, RAII потоки и CancellationToken в C++Борис Сазонов, RAII потоки и CancellationToken в C++
Борис Сазонов, RAII потоки и CancellationToken в C++
Sergey Platonov
 
Лекция 7: Многопоточное программирование: часть 3 (OpenMP)
Лекция 7: Многопоточное программирование: часть 3 (OpenMP)Лекция 7: Многопоточное программирование: часть 3 (OpenMP)
Лекция 7: Многопоточное программирование: часть 3 (OpenMP)Mikhail Kurnosov
 
Как не сделать врагами архитектуру и оптимизацию, Кирилл Березин, Mail.ru Group
Как не сделать врагами архитектуру и оптимизацию, Кирилл Березин, Mail.ru GroupКак не сделать врагами архитектуру и оптимизацию, Кирилл Березин, Mail.ru Group
Как не сделать врагами архитектуру и оптимизацию, Кирилл Березин, Mail.ru Group
Mail.ru Group
 
Павел Довгалюк, Обратная отладка
Павел Довгалюк, Обратная отладкаПавел Довгалюк, Обратная отладка
Павел Довгалюк, Обратная отладка
Sergey Platonov
 
Внешние языки DSL на funcparserlib
Внешние языки DSL на funcparserlibВнешние языки DSL на funcparserlib
Внешние языки DSL на funcparserlib
Andrey Vlasovskikh
 
Operating Systems Hardening
Operating Systems HardeningOperating Systems Hardening
Operating Systems HardeningVasily Sartakov
 
Сверхоптимизация кода на Python
Сверхоптимизация кода на PythonСверхоптимизация кода на Python
Сверхоптимизация кода на Python
ru_Parallels
 
Kotlin with API tests
Kotlin with API testsKotlin with API tests
Kotlin with API tests
Roman Marinsky
 
Парсим CSS
Парсим CSSПарсим CSS
Парсим CSS
Badoo Development
 

What's hot (19)

Python&Printer / Андрей Пучко / penta.by
Python&Printer / Андрей Пучко / penta.byPython&Printer / Андрей Пучко / penta.by
Python&Printer / Андрей Пучко / penta.by
 
Быстрые конструкции в Python - Олег Шидловский, Python Meetup 26.09.2014
Быстрые конструкции в Python - Олег Шидловский, Python Meetup 26.09.2014Быстрые конструкции в Python - Олег Шидловский, Python Meetup 26.09.2014
Быстрые конструкции в Python - Олег Шидловский, Python Meetup 26.09.2014
 
Почему Rust стоит вашего внимания
Почему Rust стоит вашего вниманияПочему Rust стоит вашего внимания
Почему Rust стоит вашего внимания
 
Мир Python функционалим с помощью библиотек
Мир Python  функционалим с помощью библиотекМир Python  функционалим с помощью библиотек
Мир Python функционалим с помощью библиотек
 
Сладкое будущее: Phalcon и Zephir
Сладкое будущее: Phalcon и ZephirСладкое будущее: Phalcon и Zephir
Сладкое будущее: Phalcon и Zephir
 
Опыт применения активных объектов во встраиваемых системах. Архитектурные асп...
Опыт применения активных объектов во встраиваемых системах. Архитектурные асп...Опыт применения активных объектов во встраиваемых системах. Архитектурные асп...
Опыт применения активных объектов во встраиваемых системах. Архитектурные асп...
 
Для чего мы делали свой акторный фреймворк и что из этого вышло?
Для чего мы делали свой акторный фреймворк и что из этого вышло?Для чего мы делали свой акторный фреймворк и что из этого вышло?
Для чего мы делали свой акторный фреймворк и что из этого вышло?
 
Александр Фокин, Рефлексия в C++
Александр Фокин, Рефлексия в C++Александр Фокин, Рефлексия в C++
Александр Фокин, Рефлексия в C++
 
Python и Cython
Python и CythonPython и Cython
Python и Cython
 
Полухин Антон, Как делать не надо: C++ велосипедостроение для профессионалов
Полухин Антон, Как делать не надо: C++ велосипедостроение для профессионаловПолухин Антон, Как делать не надо: C++ велосипедостроение для профессионалов
Полухин Антон, Как делать не надо: C++ велосипедостроение для профессионалов
 
Борис Сазонов, RAII потоки и CancellationToken в C++
Борис Сазонов, RAII потоки и CancellationToken в C++Борис Сазонов, RAII потоки и CancellationToken в C++
Борис Сазонов, RAII потоки и CancellationToken в C++
 
Лекция 7: Многопоточное программирование: часть 3 (OpenMP)
Лекция 7: Многопоточное программирование: часть 3 (OpenMP)Лекция 7: Многопоточное программирование: часть 3 (OpenMP)
Лекция 7: Многопоточное программирование: часть 3 (OpenMP)
 
Как не сделать врагами архитектуру и оптимизацию, Кирилл Березин, Mail.ru Group
Как не сделать врагами архитектуру и оптимизацию, Кирилл Березин, Mail.ru GroupКак не сделать врагами архитектуру и оптимизацию, Кирилл Березин, Mail.ru Group
Как не сделать врагами архитектуру и оптимизацию, Кирилл Березин, Mail.ru Group
 
Павел Довгалюк, Обратная отладка
Павел Довгалюк, Обратная отладкаПавел Довгалюк, Обратная отладка
Павел Довгалюк, Обратная отладка
 
Внешние языки DSL на funcparserlib
Внешние языки DSL на funcparserlibВнешние языки DSL на funcparserlib
Внешние языки DSL на funcparserlib
 
Operating Systems Hardening
Operating Systems HardeningOperating Systems Hardening
Operating Systems Hardening
 
Сверхоптимизация кода на Python
Сверхоптимизация кода на PythonСверхоптимизация кода на Python
Сверхоптимизация кода на Python
 
Kotlin with API tests
Kotlin with API testsKotlin with API tests
Kotlin with API tests
 
Парсим CSS
Парсим CSSПарсим CSS
Парсим CSS
 

Similar to "Модифицируй это!" или "Больше магии Python с помощью изменения AST"

Теория языков программирования некоторые слайды к лекциям
Теория языков программирования некоторые слайды к лекциямТеория языков программирования некоторые слайды к лекциям
Теория языков программирования некоторые слайды к лекциям
Sergey Staroletov
 
Обзор Ruby
Обзор RubyОбзор Ruby
Развитие технологий генерации эксплойтов на основе анализа бинарного кода
Развитие технологий генерации эксплойтов на основе анализа бинарного кодаРазвитие технологий генерации эксплойтов на основе анализа бинарного кода
Развитие технологий генерации эксплойтов на основе анализа бинарного кодаPositive Hack Days
 
Применение статического анализа при разработке программ
Применение статического анализа при разработке программПрименение статического анализа при разработке программ
Применение статического анализа при разработке программ
Tatyanazaxarova
 
Универсальный сигнатурный анализ кода на C#, Java, PHP
Универсальный сигнатурный анализ кода на C#, Java, PHPУниверсальный сигнатурный анализ кода на C#, Java, PHP
Универсальный сигнатурный анализ кода на C#, Java, PHP
Иван Кочуркин
 
Язык программирования Паскаль
Язык программирования ПаскальЯзык программирования Паскаль
Язык программирования ПаскальOlgaDask
 
Java. Строки. Класс String.
Java. Строки. Класс String.Java. Строки. Класс String.
Java. Строки. Класс String.
Unguryan Vitaliy
 
Scala для всех (РИФ 2015)
Scala для всех (РИФ 2015)Scala для всех (РИФ 2015)
Scala для всех (РИФ 2015)
Арсений Жижелев
 
Ada in education-09-oct06
Ada in education-09-oct06Ada in education-09-oct06
Ada in education-09-oct06Pavel Zhukov
 
Память в Java. Garbage Collector
Память в Java. Garbage CollectorПамять в Java. Garbage Collector
Память в Java. Garbage Collector
Olexandra Dmytrenko
 
Java. Методы
Java. Методы Java. Методы
Java. Методы
Unguryan Vitaliy
 
Solit 2014, EcmaScript 6 in Action, Трухин Юрий
Solit 2014, EcmaScript 6 in Action, Трухин Юрий Solit 2014, EcmaScript 6 in Action, Трухин Юрий
Solit 2014, EcmaScript 6 in Action, Трухин Юрий
solit
 
Custom Language Plugin for JetBrains IDEA
Custom Language Plugin for JetBrains IDEACustom Language Plugin for JetBrains IDEA
Custom Language Plugin for JetBrains IDEA
Alexander Zastashkov
 
C# Desktop. Занятие 05.
C# Desktop. Занятие 05.C# Desktop. Занятие 05.
C# Desktop. Занятие 05.
Igor Shkulipa
 

Similar to "Модифицируй это!" или "Больше магии Python с помощью изменения AST" (20)

Rgsu04
Rgsu04Rgsu04
Rgsu04
 
Rgsu04
Rgsu04Rgsu04
Rgsu04
 
Теория языков программирования некоторые слайды к лекциям
Теория языков программирования некоторые слайды к лекциямТеория языков программирования некоторые слайды к лекциям
Теория языков программирования некоторые слайды к лекциям
 
Обзор Ruby
Обзор RubyОбзор Ruby
Обзор Ruby
 
Развитие технологий генерации эксплойтов на основе анализа бинарного кода
Развитие технологий генерации эксплойтов на основе анализа бинарного кодаРазвитие технологий генерации эксплойтов на основе анализа бинарного кода
Развитие технологий генерации эксплойтов на основе анализа бинарного кода
 
лек7
лек7лек7
лек7
 
лек7
лек7лек7
лек7
 
лек8
лек8лек8
лек8
 
Применение статического анализа при разработке программ
Применение статического анализа при разработке программПрименение статического анализа при разработке программ
Применение статического анализа при разработке программ
 
Универсальный сигнатурный анализ кода на C#, Java, PHP
Универсальный сигнатурный анализ кода на C#, Java, PHPУниверсальный сигнатурный анализ кода на C#, Java, PHP
Универсальный сигнатурный анализ кода на C#, Java, PHP
 
Язык программирования Паскаль
Язык программирования ПаскальЯзык программирования Паскаль
Язык программирования Паскаль
 
X text
X textX text
X text
 
Java. Строки. Класс String.
Java. Строки. Класс String.Java. Строки. Класс String.
Java. Строки. Класс String.
 
Scala для всех (РИФ 2015)
Scala для всех (РИФ 2015)Scala для всех (РИФ 2015)
Scala для всех (РИФ 2015)
 
Ada in education-09-oct06
Ada in education-09-oct06Ada in education-09-oct06
Ada in education-09-oct06
 
Память в Java. Garbage Collector
Память в Java. Garbage CollectorПамять в Java. Garbage Collector
Память в Java. Garbage Collector
 
Java. Методы
Java. Методы Java. Методы
Java. Методы
 
Solit 2014, EcmaScript 6 in Action, Трухин Юрий
Solit 2014, EcmaScript 6 in Action, Трухин Юрий Solit 2014, EcmaScript 6 in Action, Трухин Юрий
Solit 2014, EcmaScript 6 in Action, Трухин Юрий
 
Custom Language Plugin for JetBrains IDEA
Custom Language Plugin for JetBrains IDEACustom Language Plugin for JetBrains IDEA
Custom Language Plugin for JetBrains IDEA
 
C# Desktop. Занятие 05.
C# Desktop. Занятие 05.C# Desktop. Занятие 05.
C# Desktop. Занятие 05.
 

More from PyNSK

Нейронные сети и Keras. Часть 1
Нейронные сети и Keras. Часть 1Нейронные сети и Keras. Часть 1
Нейронные сети и Keras. Часть 1
PyNSK
 
Нейронные сети и Keras. Часть 2
Нейронные сети и Keras. Часть 2Нейронные сети и Keras. Часть 2
Нейронные сети и Keras. Часть 2
PyNSK
 
Asyncio для процессинга распределенной базы данных
Asyncio для процессинга  распределенной базы данныхAsyncio для процессинга  распределенной базы данных
Asyncio для процессинга распределенной базы данных
PyNSK
 
Python для GameDev
Python для GameDevPython для GameDev
Python для GameDev
PyNSK
 
Python инструменты для нагрузочного тестирования
Python инструменты для нагрузочного тестированияPython инструменты для нагрузочного тестирования
Python инструменты для нагрузочного тестирования
PyNSK
 
Python, Django и корпоративные информационные системы
Python, Django и корпоративные информационные системыPython, Django и корпоративные информационные системы
Python, Django и корпоративные информационные системы
PyNSK
 
Настрой контент под пользователя!
Настрой контент под пользователя!Настрой контент под пользователя!
Настрой контент под пользователя!
PyNSK
 
Питон в малине
Питон в малинеПитон в малине
Питон в малине
PyNSK
 
Мой Python всегда со мной!
Мой Python всегда со мной!Мой Python всегда со мной!
Мой Python всегда со мной!
PyNSK
 
Как и зачем можно создать DSL на Python
Как и зачем можно создать DSL на PythonКак и зачем можно создать DSL на Python
Как и зачем можно создать DSL на Python
PyNSK
 
Чем Python плох для стартапа?
Чем Python плох для стартапа?Чем Python плох для стартапа?
Чем Python плох для стартапа?
PyNSK
 
Во внутренности Kivy
Во внутренности KivyВо внутренности Kivy
Во внутренности Kivy
PyNSK
 
Зоопарк python веб-фреймворков
Зоопарк python веб-фреймворковЗоопарк python веб-фреймворков
Зоопарк python веб-фреймворков
PyNSK
 
Как Python Дайджест работает с внешней статикой
Как Python Дайджест работает с внешней статикойКак Python Дайджест работает с внешней статикой
Как Python Дайджест работает с внешней статикой
PyNSK
 
Применение behave+webdriver для тестирования Web-проектов
Применение behave+webdriver для тестирования Web-проектовПрименение behave+webdriver для тестирования Web-проектов
Применение behave+webdriver для тестирования Web-проектов
PyNSK
 
Ctypes в игровых приложениях на python
Ctypes в игровых приложениях на pythonCtypes в игровых приложениях на python
Ctypes в игровых приложениях на python
PyNSK
 
Оптимизация производительности Python
Оптимизация производительности PythonОптимизация производительности Python
Оптимизация производительности Python
PyNSK
 
Python инструменты решения типичных задач
Python  инструменты решения типичных задачPython  инструменты решения типичных задач
Python инструменты решения типичных задач
PyNSK
 
JSON-RPC или когда rest неудобен
JSON-RPC или когда rest неудобенJSON-RPC или когда rest неудобен
JSON-RPC или когда rest неудобен
PyNSK
 
TestRail. Некоторые возможности интеграции.
TestRail. Некоторые возможности интеграции.TestRail. Некоторые возможности интеграции.
TestRail. Некоторые возможности интеграции.
PyNSK
 

More from PyNSK (20)

Нейронные сети и Keras. Часть 1
Нейронные сети и Keras. Часть 1Нейронные сети и Keras. Часть 1
Нейронные сети и Keras. Часть 1
 
Нейронные сети и Keras. Часть 2
Нейронные сети и Keras. Часть 2Нейронные сети и Keras. Часть 2
Нейронные сети и Keras. Часть 2
 
Asyncio для процессинга распределенной базы данных
Asyncio для процессинга  распределенной базы данныхAsyncio для процессинга  распределенной базы данных
Asyncio для процессинга распределенной базы данных
 
Python для GameDev
Python для GameDevPython для GameDev
Python для GameDev
 
Python инструменты для нагрузочного тестирования
Python инструменты для нагрузочного тестированияPython инструменты для нагрузочного тестирования
Python инструменты для нагрузочного тестирования
 
Python, Django и корпоративные информационные системы
Python, Django и корпоративные информационные системыPython, Django и корпоративные информационные системы
Python, Django и корпоративные информационные системы
 
Настрой контент под пользователя!
Настрой контент под пользователя!Настрой контент под пользователя!
Настрой контент под пользователя!
 
Питон в малине
Питон в малинеПитон в малине
Питон в малине
 
Мой Python всегда со мной!
Мой Python всегда со мной!Мой Python всегда со мной!
Мой Python всегда со мной!
 
Как и зачем можно создать DSL на Python
Как и зачем можно создать DSL на PythonКак и зачем можно создать DSL на Python
Как и зачем можно создать DSL на Python
 
Чем Python плох для стартапа?
Чем Python плох для стартапа?Чем Python плох для стартапа?
Чем Python плох для стартапа?
 
Во внутренности Kivy
Во внутренности KivyВо внутренности Kivy
Во внутренности Kivy
 
Зоопарк python веб-фреймворков
Зоопарк python веб-фреймворковЗоопарк python веб-фреймворков
Зоопарк python веб-фреймворков
 
Как Python Дайджест работает с внешней статикой
Как Python Дайджест работает с внешней статикойКак Python Дайджест работает с внешней статикой
Как Python Дайджест работает с внешней статикой
 
Применение behave+webdriver для тестирования Web-проектов
Применение behave+webdriver для тестирования Web-проектовПрименение behave+webdriver для тестирования Web-проектов
Применение behave+webdriver для тестирования Web-проектов
 
Ctypes в игровых приложениях на python
Ctypes в игровых приложениях на pythonCtypes в игровых приложениях на python
Ctypes в игровых приложениях на python
 
Оптимизация производительности Python
Оптимизация производительности PythonОптимизация производительности Python
Оптимизация производительности Python
 
Python инструменты решения типичных задач
Python  инструменты решения типичных задачPython  инструменты решения типичных задач
Python инструменты решения типичных задач
 
JSON-RPC или когда rest неудобен
JSON-RPC или когда rest неудобенJSON-RPC или когда rest неудобен
JSON-RPC или когда rest неудобен
 
TestRail. Некоторые возможности интеграции.
TestRail. Некоторые возможности интеграции.TestRail. Некоторые возможности интеграции.
TestRail. Некоторые возможности интеграции.
 

"Модифицируй это!" или "Больше магии Python с помощью изменения AST"