SlideShare a Scribd company logo
1 of 27
Download to read offline
МЕТАПРОГРАММИРОВАНИЕ 
КОД, УПРАВЛЯЮЩИЙ КОДОМ
ВИДЫ МЕТАПРОГРАММИРОВАНИЯ
МАКРОСЫ/ШАБЛОНЫ
ВНЕЯЗЫКОВЫЕ СРЕДСТВА
DSL 
DOMAIN-SPECIFIC LANGUAGE
ИНТЕРПРЕТАЦИЯ ПРОИЗВОЛЬНОГО КОДА
ИНТРОСПЕКЦИЯ
ИНТРОСПЕКЦИЯ 
Возможность получить информацию о структуре базовых 
элементов языка в ходе исполнения программы. 
Возможность орудовать элементами программы с такой же 
степенью свободы, как и с данными.
ПОЛУЧАЕМ 
>>> def add(x, y): 
"adds y to x and returns result" 
return x + y 
>>> print(add.__doc__) 
adds y to x and returns result 
>>> print(add.__name__) 
add
ОРУДУЕМ 
>>> x = add 
>>> x(4, 5) 
9 >>> print(x.__name__) 
add 
>>> x = {'add': add} 
>>> x['add'](2, 4) 
6
И СНОВА 
def make_adder(x): 
def adder(y): 
return x+y 
return adder 
add_7 = make_adder(7) 
>>> add_7(5) 
12
БЛИЖЕ К ЖИЗНИ 
def less_than(x): 
def validator(y): 
if x >= y: 
raise ValueError("Value must be less than %s" % x) 
return validator
ЕЩЁ БЛИЖЕ К ЖИЗНИ 
@Endpoint 
def max_int(x: Arg(int, required=True, validators=[val_gt(0), val_lt(200)]), 
y: Arg(int, validators=[val_in([1,10,105,124])])): 
return max(x,y) 
Но об этом чуть позже :)
МЕТАПРОГРАММИРОВАНИЕ В 
PYTHON
ДЕКОРАТОРЫ
def cacher(func): 
cache = {} 
def wrapper(*args): 
if not args in cache: 
cache[args] = func(*args) 
return cache[args] 
return wrapper 
def make_adder(x): 
def adder(y): 
return x+y 
return adder 
make_adder = cacher(make_adder)
@cacher 
def make_adder(x): 
def adder(y): 
return x+y 
return adder
ГЕНЕРАТОРЫ ДЕКОРАТОРОВ 
def cacher_gen(ttl) 
def cacher(func): 
cache = {} 
def wrapper(*args): 
if not args in cache or time() - ttl > cache[args][1]: 
cache[args] = (func(*args), time()) 
return cache[args] 
return wrapper 
return cacher 
cacher_for_60_secs = cacher_gen(60) 
add = cacher_for_60_secs(add) 
# add = cacher_gen(60)(add) 
################ 
# @cacher(60) 
# def add(x, y): 
# return x + y
КАК ЭТИМ ПОЛЬЗУЮТСЯ 
@app.route("/") 
def hello(): 
return "Hello World!"
ДЕСКРИПТОРЫ
class A(object): 
a = "I am A" 
x = A() 
print(getattr(x, 'a')) 
# shows "I am A". Equivalent of print(x.a)
class A(object): 
a = "I am A" 
def __getattribute__(self, name): 
return name 
x = A() 
print(getattr(x, 'a')) 
# shows "a". Equivalent of print(x.a)
ТЕПЕРЬ К ВКУСНЕНЬКОМУ
def val_lt(x): 
@customize_error("Value of `{arg_name}` must be less than {min_val}", min_val=x) 
def validator(value): 
return value < x 
return validator
def customize_error(message=None, error_class=None, error_code=10000, **opt): 
def wrapper(validator): 
validator.message = message 
validator.error_class = error_class or ValidationError 
validator.error_code = error_code 
validator.opt = opt 
return validator 
return wrapper
for validator_no, validator in enumerate(self.validators): 
if not validator(typed_value): 
template = getattr(validator, 'message', 
"Argument {arg_name} failed at validator #{validator_no}." 
"Given value: {value}") 
error_class = getattr(validator, 'error_class', ValidationError) 
error_code = getattr(validator, 'error_code', 10000) 
opt = getattr(validator, 'opt', {}) 
raise error_class(message_template=template, error_code=error_code, 
arg_name=self.__name__, value=value, 
validator_no=validator_no, **opt)
THE END

More Related Content

What's hot

Python и его тормоза
Python и его тормозаPython и его тормоза
Python и его тормозаAlexander Shigin
 
Недостатки Python
Недостатки PythonНедостатки Python
Недостатки PythonPython Meetup
 
FrontTalks: Михаил Давыдов (Яндекс), «Promise – это не больно»
FrontTalks: Михаил Давыдов (Яндекс), «Promise – это не больно»FrontTalks: Михаил Давыдов (Яндекс), «Promise – это не больно»
FrontTalks: Михаил Давыдов (Яндекс), «Promise – это не больно»Yandex
 
Python dict: прошлое, настоящее, будущее
Python dict: прошлое, настоящее, будущееPython dict: прошлое, настоящее, будущее
Python dict: прошлое, настоящее, будущееdelimitry
 
PHP basic
PHP basicPHP basic
PHP basicNoveo
 
2.4 Использование указателей
2.4 Использование указателей2.4 Использование указателей
2.4 Использование указателейDEVTYPE
 
8 встреча — Язык программирования Python (В. Ананьев)
8 встреча — Язык программирования Python (В. Ананьев)8 встреча — Язык программирования Python (В. Ананьев)
8 встреча — Язык программирования Python (В. Ананьев)Smolensk Computer Science Club
 
Как очистить массив
Как очистить массивКак очистить массив
Как очистить массивAndrew Shitov
 
DSLs in Lisp and Clojure
DSLs in Lisp and ClojureDSLs in Lisp and Clojure
DSLs in Lisp and ClojureVasil Remeniuk
 
Производительность в Django
Производительность в DjangoПроизводительность в Django
Производительность в DjangoMoscowDjango
 
Магия метаклассов
Магия метаклассовМагия метаклассов
Магия метаклассовAndrey Zakharevich
 
Юрий Гольцев - Сервис PLWWW
Юрий Гольцев - Сервис PLWWWЮрий Гольцев - Сервис PLWWW
Юрий Гольцев - Сервис PLWWWPositive Hack Days
 
plwww (24.03) MEPHI (PHDays)
plwww (24.03) MEPHI (PHDays)plwww (24.03) MEPHI (PHDays)
plwww (24.03) MEPHI (PHDays)ygoltsev
 
Курсы по мобильной разработке. 1 лекция. Знакомство с iOS
Курсы по мобильной разработке. 1 лекция. Знакомство с iOSКурсы по мобильной разработке. 1 лекция. Знакомство с iOS
Курсы по мобильной разработке. 1 лекция. Знакомство с iOSГлеб Тарасов
 
Паттерны и примеры структур данных в NoSQL на примере Tarantool
Паттерны и примеры структур данных в NoSQL на примере TarantoolПаттерны и примеры структур данных в NoSQL на примере Tarantool
Паттерны и примеры структур данных в NoSQL на примере TarantoolAlexandre Kalendarev
 
Работа с БД в Drupal 7
Работа с БД в Drupal 7Работа с БД в Drupal 7
Работа с БД в Drupal 7Eugene Fidelin
 

What's hot (20)

Python и его тормоза
Python и его тормозаPython и его тормоза
Python и его тормоза
 
Недостатки Python
Недостатки PythonНедостатки Python
Недостатки Python
 
msumobi2. Лекция 2
msumobi2. Лекция 2msumobi2. Лекция 2
msumobi2. Лекция 2
 
FrontTalks: Михаил Давыдов (Яндекс), «Promise – это не больно»
FrontTalks: Михаил Давыдов (Яндекс), «Promise – это не больно»FrontTalks: Михаил Давыдов (Яндекс), «Promise – это не больно»
FrontTalks: Михаил Давыдов (Яндекс), «Promise – это не больно»
 
Python dict: прошлое, настоящее, будущее
Python dict: прошлое, настоящее, будущееPython dict: прошлое, настоящее, будущее
Python dict: прошлое, настоящее, будущее
 
PHP basic
PHP basicPHP basic
PHP basic
 
2.4 Использование указателей
2.4 Использование указателей2.4 Использование указателей
2.4 Использование указателей
 
Scala #3
Scala #3Scala #3
Scala #3
 
8 встреча — Язык программирования Python (В. Ананьев)
8 встреча — Язык программирования Python (В. Ананьев)8 встреча — Язык программирования Python (В. Ананьев)
8 встреча — Язык программирования Python (В. Ананьев)
 
Charming python sc2-8
Charming python sc2-8Charming python sc2-8
Charming python sc2-8
 
Как очистить массив
Как очистить массивКак очистить массив
Как очистить массив
 
DSLs in Lisp and Clojure
DSLs in Lisp and ClojureDSLs in Lisp and Clojure
DSLs in Lisp and Clojure
 
South migration
South migrationSouth migration
South migration
 
Производительность в Django
Производительность в DjangoПроизводительность в Django
Производительность в Django
 
Магия метаклассов
Магия метаклассовМагия метаклассов
Магия метаклассов
 
Юрий Гольцев - Сервис PLWWW
Юрий Гольцев - Сервис PLWWWЮрий Гольцев - Сервис PLWWW
Юрий Гольцев - Сервис PLWWW
 
plwww (24.03) MEPHI (PHDays)
plwww (24.03) MEPHI (PHDays)plwww (24.03) MEPHI (PHDays)
plwww (24.03) MEPHI (PHDays)
 
Курсы по мобильной разработке. 1 лекция. Знакомство с iOS
Курсы по мобильной разработке. 1 лекция. Знакомство с iOSКурсы по мобильной разработке. 1 лекция. Знакомство с iOS
Курсы по мобильной разработке. 1 лекция. Знакомство с iOS
 
Паттерны и примеры структур данных в NoSQL на примере Tarantool
Паттерны и примеры структур данных в NoSQL на примере TarantoolПаттерны и примеры структур данных в NoSQL на примере Tarantool
Паттерны и примеры структур данных в NoSQL на примере Tarantool
 
Работа с БД в Drupal 7
Работа с БД в Drupal 7Работа с БД в Drupal 7
Работа с БД в Drupal 7
 

Similar to ITCrowd - Метапрограммирование

Лекция 2. Всё, что вы хотели знать о функциях в Python.
Лекция 2. Всё, что вы хотели знать о функциях в Python.Лекция 2. Всё, что вы хотели знать о функциях в Python.
Лекция 2. Всё, что вы хотели знать о функциях в Python.Roman Brovko
 
Лекция #5. Введение в язык программирования Python 3
Лекция #5. Введение в язык программирования Python 3Лекция #5. Введение в язык программирования Python 3
Лекция #5. Введение в язык программирования Python 3Яковенко Кирилл
 
Hadoop implementation in Wikimart
Hadoop implementation in WikimartHadoop implementation in Wikimart
Hadoop implementation in WikimartRoman Zykov
 
Интеграция Яндекс Сервер
Интеграция Яндекс СерверИнтеграция Яндекс Сервер
Интеграция Яндекс СерверPVasili
 
Метапрограммирование за гранью приличия
Метапрограммирование за гранью приличияМетапрограммирование за гранью приличия
Метапрограммирование за гранью приличияAlexander Schepanovski
 
Scala and LiftWeb presentation (Russian)
Scala and LiftWeb presentation (Russian)Scala and LiftWeb presentation (Russian)
Scala and LiftWeb presentation (Russian)Dmitry Stropalov
 
Лекция 3. Декораторы и модуль functools.
Лекция 3. Декораторы и модуль functools.Лекция 3. Декораторы и модуль functools.
Лекция 3. Декораторы и модуль functools.Roman Brovko
 
Расширения для PostgreSQL
Расширения для PostgreSQLРасширения для PostgreSQL
Расширения для PostgreSQLAnastasia Lubennikova
 
Взломать Web-сайт на ASP.NET? Сложно, но можно!
Взломать Web-сайт на ASP.NET? Сложно, но можно!Взломать Web-сайт на ASP.NET? Сложно, но можно!
Взломать Web-сайт на ASP.NET? Сложно, но можно!Vladimir Kochetkov
 
Web осень 2013 лекция 6
Web осень 2013 лекция 6Web осень 2013 лекция 6
Web осень 2013 лекция 6Technopark
 
Zend Framework и мультиязычность
Zend Framework и мультиязычностьZend Framework и мультиязычность
Zend Framework и мультиязычностьStepan Tanasiychuk
 
Разработка расширяемых приложений на Django
Разработка расширяемых приложений на DjangoРазработка расширяемых приложений на Django
Разработка расширяемых приложений на DjangoMoscowDjango
 
ZFConf 2010: Zend Framework and Doctrine
ZFConf 2010: Zend Framework and DoctrineZFConf 2010: Zend Framework and Doctrine
ZFConf 2010: Zend Framework and DoctrineZFConf Conference
 
Groovy presentation.
Groovy presentation.Groovy presentation.
Groovy presentation.Infinity
 
Формальные методы защиты приложений
Формальные методы защиты приложенийФормальные методы защиты приложений
Формальные методы защиты приложенийPositive Hack Days
 

Similar to ITCrowd - Метапрограммирование (20)

Лекция 2. Всё, что вы хотели знать о функциях в Python.
Лекция 2. Всё, что вы хотели знать о функциях в Python.Лекция 2. Всё, что вы хотели знать о функциях в Python.
Лекция 2. Всё, что вы хотели знать о функциях в Python.
 
Лекция #5. Введение в язык программирования Python 3
Лекция #5. Введение в язык программирования Python 3Лекция #5. Введение в язык программирования Python 3
Лекция #5. Введение в язык программирования Python 3
 
Hadoop implementation in Wikimart
Hadoop implementation in WikimartHadoop implementation in Wikimart
Hadoop implementation in Wikimart
 
Интеграция Яндекс Сервер
Интеграция Яндекс СерверИнтеграция Яндекс Сервер
Интеграция Яндекс Сервер
 
Метапрограммирование за гранью приличия
Метапрограммирование за гранью приличияМетапрограммирование за гранью приличия
Метапрограммирование за гранью приличия
 
Scala and LiftWeb presentation (Russian)
Scala and LiftWeb presentation (Russian)Scala and LiftWeb presentation (Russian)
Scala and LiftWeb presentation (Russian)
 
UWDC 2013, Yii2
UWDC 2013, Yii2UWDC 2013, Yii2
UWDC 2013, Yii2
 
Лекция 3. Декораторы и модуль functools.
Лекция 3. Декораторы и модуль functools.Лекция 3. Декораторы и модуль functools.
Лекция 3. Декораторы и модуль functools.
 
Расширения для PostgreSQL
Расширения для PostgreSQLРасширения для PostgreSQL
Расширения для PostgreSQL
 
Взломать Web-сайт на ASP.NET? Сложно, но можно!
Взломать Web-сайт на ASP.NET? Сложно, но можно!Взломать Web-сайт на ASP.NET? Сложно, но можно!
Взломать Web-сайт на ASP.NET? Сложно, но можно!
 
Web осень 2013 лекция 6
Web осень 2013 лекция 6Web осень 2013 лекция 6
Web осень 2013 лекция 6
 
DSLs в Perl
DSLs в PerlDSLs в Perl
DSLs в Perl
 
Zend Framework и мультиязычность
Zend Framework и мультиязычностьZend Framework и мультиязычность
Zend Framework и мультиязычность
 
Разработка расширяемых приложений на Django
Разработка расширяемых приложений на DjangoРазработка расширяемых приложений на Django
Разработка расширяемых приложений на Django
 
ZFConf 2010: Zend Framework and Doctrine
ZFConf 2010: Zend Framework and DoctrineZFConf 2010: Zend Framework and Doctrine
ZFConf 2010: Zend Framework and Doctrine
 
Groovy presentation.
Groovy presentation.Groovy presentation.
Groovy presentation.
 
Урок 7. Интерпретация и компиляция функциональных программ.
Урок 7. Интерпретация и компиляция функциональных программ.Урок 7. Интерпретация и компиляция функциональных программ.
Урок 7. Интерпретация и компиляция функциональных программ.
 
Clojure #2 (2014)
Clojure #2 (2014)Clojure #2 (2014)
Clojure #2 (2014)
 
Формальные методы защиты приложений
Формальные методы защиты приложенийФормальные методы защиты приложений
Формальные методы защиты приложений
 
Yserver
YserverYserver
Yserver
 

More from ITCrowd Almaty

Обучение фронтенд разработке
Обучение фронтенд разработкеОбучение фронтенд разработке
Обучение фронтенд разработкеITCrowd Almaty
 
Бэкенд, Фронтенд — всё смешалось. Обзорная экскурсия в будущее веб-разработки
Бэкенд, Фронтенд — всё смешалось. Обзорная экскурсия в будущее веб-разработкиБэкенд, Фронтенд — всё смешалось. Обзорная экскурсия в будущее веб-разработки
Бэкенд, Фронтенд — всё смешалось. Обзорная экскурсия в будущее веб-разработкиITCrowd Almaty
 
Docker с чем едят и для чего используют
Docker с чем едят и для чего используютDocker с чем едят и для чего используют
Docker с чем едят и для чего используютITCrowd Almaty
 
Ключ от всех дверей: чем опасен Великий Казахстанский Файерволл
Ключ от всех дверей: чем опасен Великий Казахстанский ФайерволлКлюч от всех дверей: чем опасен Великий Казахстанский Файерволл
Ключ от всех дверей: чем опасен Великий Казахстанский ФайерволлITCrowd Almaty
 
Мобильность на Колёсах: об инструментах и полезных вещах
Мобильность на Колёсах: об инструментах и полезных вещахМобильность на Колёсах: об инструментах и полезных вещах
Мобильность на Колёсах: об инструментах и полезных вещахITCrowd Almaty
 
Вредные советы для разработчиков
Вредные советы для разработчиковВредные советы для разработчиков
Вредные советы для разработчиковITCrowd Almaty
 
Чем бесят программисты
Чем бесят программистыЧем бесят программисты
Чем бесят программистыITCrowd Almaty
 
Система управления конфигурациями Ansible
Система управления конфигурациями AnsibleСистема управления конфигурациями Ansible
Система управления конфигурациями AnsibleITCrowd Almaty
 
Система мониторинга Zabbix
Система мониторинга ZabbixСистема мониторинга Zabbix
Система мониторинга ZabbixITCrowd Almaty
 
Колёса: Раньше и сейчас. Как поменять архитектуру высоконагруженного проекта
Колёса: Раньше и сейчас. Как поменять архитектуру высоконагруженного проектаКолёса: Раньше и сейчас. Как поменять архитектуру высоконагруженного проекта
Колёса: Раньше и сейчас. Как поменять архитектуру высоконагруженного проектаITCrowd Almaty
 
Разработка API для большого, нагруженного сервиса
Разработка API для большого, нагруженного сервисаРазработка API для большого, нагруженного сервиса
Разработка API для большого, нагруженного сервисаITCrowd Almaty
 
Web Performance в Казнете
Web Performance в КазнетеWeb Performance в Казнете
Web Performance в КазнетеITCrowd Almaty
 
Designer ≠ дизайнер
Designer ≠ дизайнерDesigner ≠ дизайнер
Designer ≠ дизайнерITCrowd Almaty
 
ITCrowd 2 - Разработка крупного проекта в команде
ITCrowd 2 - Разработка крупного проекта в командеITCrowd 2 - Разработка крупного проекта в команде
ITCrowd 2 - Разработка крупного проекта в командеITCrowd Almaty
 
ITCrowd 2 - Обзор существующих стандартов разметки и продуктов на ее основе
ITCrowd 2 - Обзор существующих стандартов разметки и продуктов на ее основеITCrowd 2 - Обзор существующих стандартов разметки и продуктов на ее основе
ITCrowd 2 - Обзор существующих стандартов разметки и продуктов на ее основеITCrowd Almaty
 
ITCrowd - Потенциал казахоязычной аудитории РК
ITCrowd - Потенциал казахоязычной аудитории РКITCrowd - Потенциал казахоязычной аудитории РК
ITCrowd - Потенциал казахоязычной аудитории РКITCrowd Almaty
 

More from ITCrowd Almaty (20)

Обучение фронтенд разработке
Обучение фронтенд разработкеОбучение фронтенд разработке
Обучение фронтенд разработке
 
Бэкенд, Фронтенд — всё смешалось. Обзорная экскурсия в будущее веб-разработки
Бэкенд, Фронтенд — всё смешалось. Обзорная экскурсия в будущее веб-разработкиБэкенд, Фронтенд — всё смешалось. Обзорная экскурсия в будущее веб-разработки
Бэкенд, Фронтенд — всё смешалось. Обзорная экскурсия в будущее веб-разработки
 
На плаву!
На плаву!На плаву!
На плаву!
 
Docker с чем едят и для чего используют
Docker с чем едят и для чего используютDocker с чем едят и для чего используют
Docker с чем едят и для чего используют
 
Ключ от всех дверей: чем опасен Великий Казахстанский Файерволл
Ключ от всех дверей: чем опасен Великий Казахстанский ФайерволлКлюч от всех дверей: чем опасен Великий Казахстанский Файерволл
Ключ от всех дверей: чем опасен Великий Казахстанский Файерволл
 
Мобильность на Колёсах: об инструментах и полезных вещах
Мобильность на Колёсах: об инструментах и полезных вещахМобильность на Колёсах: об инструментах и полезных вещах
Мобильность на Колёсах: об инструментах и полезных вещах
 
Вредные советы для разработчиков
Вредные советы для разработчиковВредные советы для разработчиков
Вредные советы для разработчиков
 
Чем бесят программисты
Чем бесят программистыЧем бесят программисты
Чем бесят программисты
 
Система управления конфигурациями Ansible
Система управления конфигурациями AnsibleСистема управления конфигурациями Ansible
Система управления конфигурациями Ansible
 
Система мониторинга Zabbix
Система мониторинга ZabbixСистема мониторинга Zabbix
Система мониторинга Zabbix
 
React + Flux
React + FluxReact + Flux
React + Flux
 
WatchKit 101
WatchKit 101WatchKit 101
WatchKit 101
 
Колёса: Раньше и сейчас. Как поменять архитектуру высоконагруженного проекта
Колёса: Раньше и сейчас. Как поменять архитектуру высоконагруженного проектаКолёса: Раньше и сейчас. Как поменять архитектуру высоконагруженного проекта
Колёса: Раньше и сейчас. Как поменять архитектуру высоконагруженного проекта
 
Разработка API для большого, нагруженного сервиса
Разработка API для большого, нагруженного сервисаРазработка API для большого, нагруженного сервиса
Разработка API для большого, нагруженного сервиса
 
Web Performance в Казнете
Web Performance в КазнетеWeb Performance в Казнете
Web Performance в Казнете
 
AngularJS
AngularJSAngularJS
AngularJS
 
Designer ≠ дизайнер
Designer ≠ дизайнерDesigner ≠ дизайнер
Designer ≠ дизайнер
 
ITCrowd 2 - Разработка крупного проекта в команде
ITCrowd 2 - Разработка крупного проекта в командеITCrowd 2 - Разработка крупного проекта в команде
ITCrowd 2 - Разработка крупного проекта в команде
 
ITCrowd 2 - Обзор существующих стандартов разметки и продуктов на ее основе
ITCrowd 2 - Обзор существующих стандартов разметки и продуктов на ее основеITCrowd 2 - Обзор существующих стандартов разметки и продуктов на ее основе
ITCrowd 2 - Обзор существующих стандартов разметки и продуктов на ее основе
 
ITCrowd - Потенциал казахоязычной аудитории РК
ITCrowd - Потенциал казахоязычной аудитории РКITCrowd - Потенциал казахоязычной аудитории РК
ITCrowd - Потенциал казахоязычной аудитории РК
 

ITCrowd - Метапрограммирование