SlideShare uma empresa Scribd logo
1 de 26
PYTHON AST
MODULE
Между исходным текстом и байткодом
Николай Карелин
Что это?
• Abstract Syntax Tree:
• Представление абстрактной структуры кода языка
программирования в виде дерева объектов
• В отличие от дерева разбора (parse tree) остаются только
элементы синтаксиса языка
Компиляция кода
• Python 2.5 и позже
• By Armin Ronacher
.py
Parse
Tree
CFG*
bytecode
AST
*CFG = Control Flow Graph
Пример 1
Module
FunctionDef
Name
Expr Pass
body
arguments
body
Module(
body=[
FunctionDef(name='func', args=arguments(
args=[Name(id='x', ctx=Param())],
vararg=None, kwarg=None,
defaults=[]),
body=[Expr(value=Str(s='My function')),
Pass()],
decorator_list=[])])
Str
value
Param
ctx
Пример 2
https://github.com/titusjan/astviewer
Attributes
Fields
Структура модуля
• from _ast import *
• Часть С-кода
• Определение всех объектов
• Helper functions
• Получение
• Обработка
• Манипуляции
• Visitor/Transformer class prototypes
Иерархия объектов
AST
comprehension
boolop cmpop
arguments excepthandler
alias expr_context
exprmod
operator
keyword
unaryopstmt slice
103 classes in total
Иерархия объектов
• Attribute, BinOp, BoolOp,
• Call, Compare, Dict,
• DictComp, GeneratorExp,
• IfExp, Lambda, List,
• ListComp, Name, Num,
• Repr, Set, SetComp,
• Str, Subscript, Tuple,
• UnaryOp, Yield
• Assert, Assign,
• AugAssign, Break,
• ClassDef, Continue, Delete,
• Exec, Expr, For,
• FunctionDef, Global,
• If, Import, ImportFrom,
• Pass, Print, Raise,
• Return, TryExcept,
• TryFinally, While, With
expr stmt
Синтаксис Python
Синтаксис Python
ASDL (Zephyr Abstract Syntax Definition Language) format
Использует Python скрипт для генерации C-кода ;)
Опционально
0 или более
Примеры
• blaze, cffi, enaml, Ipython
• numpy (SafeEval), pandas, scipy.weave, sympy
• pep8, pip, pycparser pylint pyflakes rope
Применение: компиляция
• Numba, http://numba.pydata.org/
• HOPE, http://hope.phys.ethz.ch
• PyJS (Pyjamas), http://pyjs.org,
https://github.com/pyjs/pyjs
.py
Parse
Tree
CFG
bytecode
AST
LLVM
Visitor
GreenTreeSnakes
Свой язык в Python
• Hy ;)
.py
Parse
Tree
CFG
bytecode
AST
Создание AST
Hy: HyASTCompiler.compile()
Сode instrumenting
• Pyflakes, …
• Macros (http://www.pocoo.org/projects/karnickel/)
.py
Parse
Tree
CFG
bytecode
AST
?
numpy.utils.safe_eval()
…
См. также ast.literal_eval()
Осторожно!
There Might be Dragons!
AST - Предосторожности
• Странные ошибки (segfaults)
• Нет гарантии стабильности API
• Разная структура для
• 2.x <-> 3.x
• Разные версии ветки 3.x
• Cpython, PyPy, Jython, …
Что дальше
• Hacker’s Guide to Python
• PEP 339 / Python Dev. Guide
• Green Tree Snakes documentation,
https://greentreesnakes.readthedocs.org/en/latest/
• ast module documentation
• http://pyvideo.org/video/419/pycon-2011--what-would-you-
do-with-an-ast
• http://www.dalkescientific.com/writings/diary/archive/2010/
02/22/instrumenting_the_ast.html
Hacker’s Guide to Python
Table of contents
1. Starting your project
2. Modules and libraries
3. Documentation
4. Distribution
5. Virtual environments
6. Unit testing
7. Methods and decorators
8. Functional programming
9. The AST
10. Performances and optimizations
11. Scaling and architecture
12. RDBMS and ORM
13. Python 3 support strategies
14. Write less, code more
https://julien.danjou.info/books/the-hacker-guide-to-python
THE END
На будущее
• Sphinx и ReST для документирования проектов
• Python для численных расчетов (Numba, GPU, …)
• ctypesgen – обертки над внешними библиотеками
???
Ищется помощь по белорусификации
http://pymorphy2.readthedocs.org/en/latest/
https://github.com/kmike/pymorphy2

Mais conteúdo relacionado

Mais procurados

«Память и Python. Что надо знать для счастья?» Алексей Кузьмин, ЦНС
«Память и Python. Что надо знать для счастья?» Алексей Кузьмин, ЦНС«Память и Python. Что надо знать для счастья?» Алексей Кузьмин, ЦНС
«Память и Python. Что надо знать для счастья?» Алексей Кузьмин, ЦНС
it-people
 

Mais procurados (20)

Мир Python функционалим с помощью библиотек
Мир Python  функционалим с помощью библиотекМир Python  функционалим с помощью библиотек
Мир Python функционалим с помощью библиотек
 
Python&Printer / Андрей Пучко / penta.by
Python&Printer / Андрей Пучко / penta.byPython&Printer / Андрей Пучко / penta.by
Python&Printer / Андрей Пучко / penta.by
 
Ecma script 6 in action
Ecma script 6 in actionEcma script 6 in action
Ecma script 6 in action
 
Быстрые конструкции в 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. Что надо знать для счастья?» Алексей Кузьмин, ЦНС
«Память и Python. Что надо знать для счастья?» Алексей Кузьмин, ЦНС«Память и Python. Что надо знать для счастья?» Алексей Кузьмин, ЦНС
«Память и Python. Что надо знать для счастья?» Алексей Кузьмин, ЦНС
 
Python и Cython
Python и CythonPython и Cython
Python и Cython
 
Почему Rust стоит вашего внимания
Почему Rust стоит вашего вниманияПочему Rust стоит вашего внимания
Почему Rust стоит вашего внимания
 
Сладкое будущее: Phalcon и Zephir
Сладкое будущее: Phalcon и ZephirСладкое будущее: Phalcon и Zephir
Сладкое будущее: Phalcon и Zephir
 
Алексей Куканов — Параллелизм в C++: управляйте приложением, а не потоками!
Алексей Куканов — Параллелизм в C++: управляйте приложением, а не потоками!Алексей Куканов — Параллелизм в C++: управляйте приложением, а не потоками!
Алексей Куканов — Параллелизм в C++: управляйте приложением, а не потоками!
 
Александр Фокин, Рефлексия в C++
Александр Фокин, Рефлексия в C++Александр Фокин, Рефлексия в C++
Александр Фокин, Рефлексия в C++
 
Для чего мы делали свой акторный фреймворк и что из этого вышло?
Для чего мы делали свой акторный фреймворк и что из этого вышло?Для чего мы делали свой акторный фреймворк и что из этого вышло?
Для чего мы делали свой акторный фреймворк и что из этого вышло?
 
Полухин Антон, Как делать не надо: C++ велосипедостроение для профессионалов
Полухин Антон, Как делать не надо: C++ велосипедостроение для профессионаловПолухин Антон, Как делать не надо: C++ велосипедостроение для профессионалов
Полухин Антон, Как делать не надо: C++ велосипедостроение для профессионалов
 
About Python
About PythonAbout Python
About Python
 
Борис Сазонов, RAII потоки и CancellationToken в C++
Борис Сазонов, RAII потоки и CancellationToken в C++Борис Сазонов, RAII потоки и CancellationToken в C++
Борис Сазонов, RAII потоки и CancellationToken в C++
 
Магия в Python: Дескрипторы. Что это?
Магия в Python: Дескрипторы. Что это?Магия в Python: Дескрипторы. Что это?
Магия в Python: Дескрипторы. Что это?
 
Something about Golang
Something about GolangSomething about Golang
Something about Golang
 
Руслан Гроховецкий "Как Python стал делать погоду в Яндексе"
Руслан Гроховецкий "Как Python стал делать погоду в Яндексе"Руслан Гроховецкий "Как Python стал делать погоду в Яндексе"
Руслан Гроховецкий "Как Python стал делать погоду в Яндексе"
 
Reform: путь к лучшему ORM
Reform: путь к лучшему ORMReform: путь к лучшему ORM
Reform: путь к лучшему ORM
 
Павел Довгалюк, Обратная отладка
Павел Довгалюк, Обратная отладкаПавел Довгалюк, Обратная отладка
Павел Довгалюк, Обратная отладка
 
Язык Lua — секреты производительности / Ник Заварицкий (Mail.ru)
Язык Lua — секреты производительности / Ник Заварицкий (Mail.ru)Язык Lua — секреты производительности / Ник Заварицкий (Mail.ru)
Язык Lua — секреты производительности / Ник Заварицкий (Mail.ru)
 

Destaque

Максим Щепелин. "Unittesting. Как?"
Максим Щепелин. "Unittesting. Как?"Максим Щепелин. "Unittesting. Как?"
Максим Щепелин. "Unittesting. Как?"
Python Meetup
 
S.O.L.I.D. - Павел Кохан, Python Meetup 26.09.2014
S.O.L.I.D. - Павел Кохан, Python Meetup 26.09.2014S.O.L.I.D. - Павел Кохан, Python Meetup 26.09.2014
S.O.L.I.D. - Павел Кохан, Python Meetup 26.09.2014
Python Meetup
 

Destaque (18)

Недостатки Python
Недостатки PythonНедостатки Python
Недостатки Python
 
Портируем на Python 3
Портируем на Python 3Портируем на Python 3
Портируем на Python 3
 
Vasily Khoruzhik - libusb vs linux kernel — сравнение userspace & kernelspace...
Vasily Khoruzhik - libusb vs linux kernel — сравнение userspace & kernelspace...Vasily Khoruzhik - libusb vs linux kernel — сравнение userspace & kernelspace...
Vasily Khoruzhik - libusb vs linux kernel — сравнение userspace & kernelspace...
 
Социальный игровой сервер на Python: от первого коммита до продакшена
Социальный игровой сервер на Python: от первого коммита до продакшенаСоциальный игровой сервер на Python: от первого коммита до продакшена
Социальный игровой сервер на Python: от первого коммита до продакшена
 
Максим Щепелин. "Unittesting. Как?"
Максим Щепелин. "Unittesting. Как?"Максим Щепелин. "Unittesting. Как?"
Максим Щепелин. "Unittesting. Как?"
 
Язык программирования GO
Язык программирования GOЯзык программирования GO
Язык программирования GO
 
Как скачать статистику игроков World of Tanks / Павел Пересторонин [Python Me...
Как скачать статистику игроков World of Tanks / Павел Пересторонин [Python Me...Как скачать статистику игроков World of Tanks / Павел Пересторонин [Python Me...
Как скачать статистику игроков World of Tanks / Павел Пересторонин [Python Me...
 
Очередной скучный доклад про логгирование
Очередной скучный доклад про логгированиеОчередной скучный доклад про логгирование
Очередной скучный доклад про логгирование
 
OpenSource CMS и ERP система в одном флаконе / Олег Курьян / технический дире...
OpenSource CMS и ERP система в одном флаконе / Олег Курьян / технический дире...OpenSource CMS и ERP система в одном флаконе / Олег Курьян / технический дире...
OpenSource CMS и ERP система в одном флаконе / Олег Курьян / технический дире...
 
Про асинхронность / Максим Щепелин / Web Developer Wargaming
Про асинхронность / Максим Щепелин / Web Developer WargamingПро асинхронность / Максим Щепелин / Web Developer Wargaming
Про асинхронность / Максим Щепелин / Web Developer Wargaming
 
Обзор фреймворка Twisted
Обзор фреймворка TwistedОбзор фреймворка Twisted
Обзор фреймворка Twisted
 
Обзор способов написания конкурентных программ в питоне
Обзор способов написания конкурентных программ в питоне Обзор способов написания конкурентных программ в питоне
Обзор способов написания конкурентных программ в питоне
 
Почему я пишу хороший код, но его никто не ценит, кроме моей мамы / Павел Меш...
Почему я пишу хороший код, но его никто не ценит, кроме моей мамы / Павел Меш...Почему я пишу хороший код, но его никто не ценит, кроме моей мамы / Павел Меш...
Почему я пишу хороший код, но его никто не ценит, кроме моей мамы / Павел Меш...
 
Redis. Как мы боролись со сложностью
Redis. Как мы боролись со сложностьюRedis. Как мы боролись со сложностью
Redis. Как мы боролись со сложностью
 
Wargaming: тыл - фронту!
Wargaming: тыл - фронту!Wargaming: тыл - фронту!
Wargaming: тыл - фронту!
 
Machine learning with Python / Олег Шидловский / Doist [Python Meetup 27.03.15]
Machine learning with Python / Олег Шидловский / Doist [Python Meetup 27.03.15] Machine learning with Python / Олег Шидловский / Doist [Python Meetup 27.03.15]
Machine learning with Python / Олег Шидловский / Doist [Python Meetup 27.03.15]
 
Pebble
PebblePebble
Pebble
 
S.O.L.I.D. - Павел Кохан, Python Meetup 26.09.2014
S.O.L.I.D. - Павел Кохан, Python Meetup 26.09.2014S.O.L.I.D. - Павел Кохан, Python Meetup 26.09.2014
S.O.L.I.D. - Павел Кохан, Python Meetup 26.09.2014
 

Semelhante a Python AST / Николай Карелин / VPI Development Center [Python Meetup 27.03.15]

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
 
ekbpy'2012 - Марк Коренберг - Системное программирование на Питоне
ekbpy'2012 - Марк Коренберг - Системное программирование на Питонеekbpy'2012 - Марк Коренберг - Системное программирование на Питоне
ekbpy'2012 - Марк Коренберг - Системное программирование на Питоне
it-people
 
ekbpy'2012 - Михаил Коробов - Python 3
ekbpy'2012 - Михаил Коробов - Python 3ekbpy'2012 - Михаил Коробов - Python 3
ekbpy'2012 - Михаил Коробов - Python 3
it-people
 

Semelhante a Python AST / Николай Карелин / VPI Development Center [Python Meetup 27.03.15] (20)

Practical Language for Extracting Data from Source Codes and Preparing Them f...
Practical Language for Extracting Data from Source Codes and Preparing Them f...Practical Language for Extracting Data from Source Codes and Preparing Them f...
Practical Language for Extracting Data from Source Codes and Preparing Them f...
 
Универсальный сигнатурный анализ кода на C#, Java, PHP
Универсальный сигнатурный анализ кода на C#, Java, PHPУниверсальный сигнатурный анализ кода на C#, Java, PHP
Универсальный сигнатурный анализ кода на C#, Java, PHP
 
Введение в Python и Django
Введение в Python и DjangoВведение в Python и Django
Введение в Python и Django
 
Solit 2014, EcmaScript 6 in Action, Трухин Юрий
Solit 2014, EcmaScript 6 in Action, Трухин Юрий Solit 2014, EcmaScript 6 in Action, Трухин Юрий
Solit 2014, EcmaScript 6 in Action, Трухин Юрий
 
ekbpy'2012 - Марк Коренберг - Системное программирование на Питоне
ekbpy'2012 - Марк Коренберг - Системное программирование на Питонеekbpy'2012 - Марк Коренберг - Системное программирование на Питоне
ekbpy'2012 - Марк Коренберг - Системное программирование на Питоне
 
09 - Hadoop. Pig
09 - Hadoop. Pig09 - Hadoop. Pig
09 - Hadoop. Pig
 
Bytecode
BytecodeBytecode
Bytecode
 
Intelligent или сделай мне красиво
Intelligent или сделай мне красивоIntelligent или сделай мне красиво
Intelligent или сделай мне красиво
 
Roslyn API : SyntaxTree vs CodeDom, SemanticModel vs Reflection
Roslyn API: SyntaxTree vs CodeDom, SemanticModel vs ReflectionRoslyn API: SyntaxTree vs CodeDom, SemanticModel vs Reflection
Roslyn API : SyntaxTree vs CodeDom, SemanticModel vs Reflection
 
SPA инструменты
SPA инструментыSPA инструменты
SPA инструменты
 
Rgsu04
Rgsu04Rgsu04
Rgsu04
 
Rgsu04
Rgsu04Rgsu04
Rgsu04
 
Опыт использования Spark, Основано на реальных событиях
Опыт использования Spark, Основано на реальных событияхОпыт использования Spark, Основано на реальных событиях
Опыт использования Spark, Основано на реальных событиях
 
Теория языков программирования некоторые слайды к лекциям
Теория языков программирования некоторые слайды к лекциямТеория языков программирования некоторые слайды к лекциям
Теория языков программирования некоторые слайды к лекциям
 
Приемы, затрудняющие обнаружение и анализ вредоносного кода в PHP скриптах
Приемы, затрудняющие обнаружение и анализ вредоносного кода в PHP скриптахПриемы, затрудняющие обнаружение и анализ вредоносного кода в PHP скриптах
Приемы, затрудняющие обнаружение и анализ вредоносного кода в PHP скриптах
 
Принципы работы статического анализатора кода PVS-Studio
Принципы работы статического анализатора кода PVS-StudioПринципы работы статического анализатора кода PVS-Studio
Принципы работы статического анализатора кода PVS-Studio
 
ekbpy'2012 - Михаил Коробов - Python 3
ekbpy'2012 - Михаил Коробов - Python 3ekbpy'2012 - Михаил Коробов - Python 3
ekbpy'2012 - Михаил Коробов - Python 3
 
Rust - GDG DevFest 2016 Nizhny Novgorod
Rust - GDG DevFest 2016 Nizhny NovgorodRust - GDG DevFest 2016 Nizhny Novgorod
Rust - GDG DevFest 2016 Nizhny Novgorod
 
php frameworks
php frameworksphp frameworks
php frameworks
 
Formal verification of operating system kernels
Formal verification of operating system kernelsFormal verification of operating system kernels
Formal verification of operating system kernels
 

Mais de Python Meetup

Mais de Python Meetup (8)

Python для анализа данных
Python для анализа данныхPython для анализа данных
Python для анализа данных
 
Асинхронное распределенное выполнение задач. Stdlib, Celery, RQ и собственные...
Асинхронное распределенное выполнение задач. Stdlib, Celery, RQ и собственные...Асинхронное распределенное выполнение задач. Stdlib, Celery, RQ и собственные...
Асинхронное распределенное выполнение задач. Stdlib, Celery, RQ и собственные...
 
Использование gevent для эмуляции высокой нагрузки
Использование gevent для эмуляции высокой нагрузкиИспользование gevent для эмуляции высокой нагрузки
Использование gevent для эмуляции высокой нагрузки
 
Введение в GIL и новый GIL
Введение в GIL и новый GILВведение в GIL и новый GIL
Введение в GIL и новый GIL
 
Garbage collector and a bit of memory management
Garbage collector and a bit of memory managementGarbage collector and a bit of memory management
Garbage collector and a bit of memory management
 
Неочевидное поведение некоторых конструкций
Неочевидное поведение некоторых конструкцийНеочевидное поведение некоторых конструкций
Неочевидное поведение некоторых конструкций
 
Pyton – пробуем функциональный стиль
Pyton – пробуем функциональный стильPyton – пробуем функциональный стиль
Pyton – пробуем функциональный стиль
 
Dictionary в Python. По мотивам Objects/dictnotes.txt
Dictionary в Python. По мотивам Objects/dictnotes.txtDictionary в Python. По мотивам Objects/dictnotes.txt
Dictionary в Python. По мотивам Objects/dictnotes.txt
 

Python AST / Николай Карелин / VPI Development Center [Python Meetup 27.03.15]