«Модифицируй это!»
или
«Больше магии 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
"Модифицируй это!" или "Больше магии Python с помощью изменения AST"
Часть 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
"Модифицируй это!" или "Больше магии Python с помощью изменения AST"
Часть 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
"Модифицируй это!" или "Больше магии Python с помощью изменения AST"
Часть 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
"Модифицируй это!" или "Больше магии Python с помощью изменения AST"
Проект 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

PPTX
Python AST / Николай Карелин / VPI Development Center [Python Meetup 27.03.15]
PDF
Введение в потоки питона
PDF
"Внутренности" CPython, часть II
PDF
Practical Python Packaging / Стас Рудаков / Web Developer Wargaming
PDF
Беглый обзор "внутренностей" Python
PDF
Ecma script 6 in action
PPTX
SWIG — cоздание мультиязыковых интерфейсов для C/C++ библиотек
ODP
About Python
Python AST / Николай Карелин / VPI Development Center [Python Meetup 27.03.15]
Введение в потоки питона
"Внутренности" CPython, часть II
Practical Python Packaging / Стас Рудаков / Web Developer Wargaming
Беглый обзор "внутренностей" Python
Ecma script 6 in action
SWIG — cоздание мультиязыковых интерфейсов для C/C++ библиотек
About Python

What's hot (19)

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

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

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

More from PyNSK (20)

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

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