Upgrade to Pro
— share decks privately, control downloads, hide ads and more …
Speaker Deck
Features
Speaker Deck
PRO
Sign in
Sign up for free
Search
Search
Wingardium Leviosa
Search
Serge Matveenko
April 25, 2014
Programming
170
0
Share
Embed
Copy iframe code
Copy JS code
Copy link
Start on current slide
Wingardium Leviosa
Python declarative magic basics
Serge Matveenko
April 25, 2014
More Decks by Serge Matveenko
See All by Serge Matveenko
Using NSQ in Python
lig
0
150
Build a container on Gitlab CI quest — Game Walkthrough
lig
0
230
Mnj — The MongoDB library which feels good
lig
0
200
Writing Dockerfile for a Python project the right way
lig
0
400
Pyventory for Ansible
lig
0
210
What time is it now?
lig
1
370
100% Test Covɘrage
lig
2
210
What in fact is this Python?
lig
2
230
Mnj — the MongoDB library which does it right
lig
1
310
Other Decks in Programming
See All in Programming
Claude CodeとAgentCore Gatewayを繋ぐ際の認証認可 / Authentication and authorization when connecting Claude Code with AgentCore Gateway
har1101
2
290
yield再入門 #phpcon
o0h
PRO
0
1.1k
変わらないものが、変わるものを決める — 意図駆動開発 × イベントソーシング × イミュータブル | What Doesn't Change Decides What Can — IDD × Event Sourcing × Immutability
tomohisa
0
1.8k
GDG Korea Android: 2026 I/O Extended ~ What's new in Android development tools
pluu
0
220
自動化したのに回らないテスト運用の壁ーAI時代の品質責任と生産性
mfunaki
1
140
生成AI導入の「期待外れ」を乗り越える ー 開発フロー改革が目指す、真の組織変革
starfish719
0
4.6k
5分で問診!Composer セキュリティ健康診断
codmoninc
0
1k
琵琶湖の水は止められてもNet--HTTPのリトライは止められない / You might be able to stop the water flow of Lake Biwa but you can't stop Net::HTTP retries
luccafort
PRO
0
740
わからない話を追いかけたら、プログラミング言語を作る側にいた
ydah
3
520
PHP に部分適用が来るぞ!……ところで何それ?おいしいの? #phpcon / phpcon-2026
shogogg
0
670
人間の目はかわらない、だからJPEGは30年もつ
yuzneri
12
18k
PostgreSQL 18で考えるUUID主キー
kazuhiro1982
0
470
Featured
See All Featured
DevOps and Value Stream Thinking: Enabling flow, efficiency and business value
helenjbeal
1
330
AI: The stuff that nobody shows you
jnunemaker
PRO
9
920
The State of eCommerce SEO: How to Win in Today's Products SERPs - #SEOweek
aleyda
2
11k
Highjacked: Video Game Concept Design
rkendrick25
PRO
1
430
Producing Creativity
orderedlist
PRO
348
40k
GraphQLの誤解/rethinking-graphql
sonatard
75
12k
XXLCSS - How to scale CSS and keep your sanity
sugarenia
249
1.3M
From π to Pie charts
rasagy
0
290
CSS Pre-Processors: Stylus, Less & Sass
bermonpainter
360
30k
svc-hook: hooking system calls on ARM64 by binary rewriting
retrage
2
490
A Guide to Academic Writing Using Generative AI - A Workshop
ks91
PRO
1
370
Creating an realtime collaboration tool: Agile Flush - .NET Oxford
marcduiker
35
2.5k
Transcript
«Вингардиум левиоса» Основы декларативной магии Сергей Матвеенко
«Harry Potter and the Philosopher's Stone»
http://xkcd.com/353/
➢ Описания: существительные и прилагательные, а не глаголы ➢ Независимость
от реализации ➢ Валидация без компиляции ➢ Не нужно уметь программировать ➢ GUI для редактирования ➢ Потому что это модно :) Декларативное программирование
➢ Декораторы ➢ Метаклассы ◦ Атрибуты классов ◦ Аргументы классов
◦ Аннотации аргументов методов ➢ Import hooks ◦ Модификация AST ◦ Генерация кода ➢ Внешние описания ◦ YAML Декларативность в Python
Декораторы @this_is_decorator(safe_mode=True) def method(arg1, arg2): # we will have just
a few lines here return arg1 + arg2 @abstractclass class ObjectBase: def foo(self): return NotImplemented
Метаклассы: атрибуты классов class MyClass(ObjectBase): sequence = True sorted =
False seq = MyClass() seq.extend([3, 2, 5]) print(seq) > [3, 2, 5]
Метаклассы: атрибуты классов class ObjectMeta(type): def __new__(cls, name, bases, attrs):
type_new = type.__new__(cls, name, bases, attrs) if attrs.get('sequence', False): # add sequence realization if attrs.get('sorted', False): # add sorted realization return type_new class ObjectBase(metaclass=ObjectMeta): pass class MyClass(ObjectBase): sequence = True sorted = False
Метаклассы: аргументы классов class SequenceMeta(type): def __new__(cls, name, bases, attrs,
sorted=False): type_new = type.__new__(cls, name, bases, attrs) if sorted: # add sorted realization return type_new class SortedSequence(metaclass=SequenceMeta, sorted=True): pass seq = SortedSequence()
Метаклассы: аннотации import inspect class StrictMeta(type): def __new__(cls, name, bases,
args): type_new = type.__new__(cls, name, bases, args) for attr_name in dir(type_new): method = getattr(type_new.attr_name) if callable(method): parameters = inspect.signature(method).parameters.values() # construct decorated method setattr(new_type, attr_name, method) return new_type class TextNumber(metaclass=StrictMeta): value = "0" def __add__(self, value: r'[\d\.]+'): # add implementation return self.value
Import hooks: модификация AST # smart_sql.py class MyImporter: def load_module(self,
name): # modify AST return module sys.path_hooks.insert(0, MyImporter) # prog.py import smart_sql query = ( id, Point(x, y) for id, x, y in "sql_table_name" if len([(x0, y0), (x, y)]) < 3)
Import hooks: генерация кода # smart_sql.py class MyImporter: def find_module(self,
fullname, path=None): # find path to DSL source file self.path = path return self def load_module(self, name): # generate and compile python module from DSL return module sys.meta_path.insert(0, MyImporter) # prog.py import smart_sql from dsl_queries import query result = query.find(radius)
YAML # pytest-yamlwsgi test_index: - path: / assert_status: 200 assert_contains:
Hello - path: / assert_contains: Hello - path: / assert_status: 200
Django ORM from django.db import models class Musician(models.Model): first_name =
models.CharField(max_length=50) last_name = models.CharField(max_length=50) instrument = models.CharField(max_length=100) class Album(models.Model): artist = models.ForeignKey(Musician) name = models.CharField(max_length=100) release_date = models.DateField() num_stars = models.IntegerField()
Django class-based generic views class PublisherDetail(DetailView): context_object_name = 'publisher' queryset
= Publisher.objects.all() class BookList(ListView): queryset = Book.objects.order_by('-publication_date') context_object_name = 'book_list' class AcmeBookList(ListView): context_object_name = 'book_list' queryset = Book.objects.filter(publisher__name='Acme') template_name = 'books/acme_list.html'
Function annotations # http://code.activestate.com/recipes/578528/ @typecheck def happy1(a:int, b:list, c:tuple=(1,2,3)) ->
float: return 3.14 @typecheck def happy_wo_annotation(a:int, b, c:tuple=(1,2,3)) -> float: return 3.14 @typecheck def unhappy1(a:int, b:str) -> float: return 314 # This can never succeed in return type
Вопросы? github.com/lig ptsecurity.com