Skip to main content
Download free for 30 days
Sign in
Upload
Language (EN)
Support
Business
Mobile
Social Media
Marketing
Technology
Art & Photos
Career
Design
Education
Presentations & Public Speaking
Government & Nonprofit
Healthcare
Internet
Law
Leadership & Management
Automotive
Engineering
Software
Recruiting & HR
Retail
Sales
Services
Science
Small Business & Entrepreneurship
Food
Environment
Economy & Finance
Data & Analytics
Investor Relations
Sports
Spiritual
News & Politics
Travel
Self Improvement
Real Estate
Entertainment & Humor
Health & Medicine
Devices & Hardware
Lifestyle
EN
Upload
Download free for 30 days
Sign in
Uploaded by
大樹 小倉
PDF, PPTX
47,132 views
Pythonによる黒魔術入門
Pythonによる(Rubyでも大体適用可能)黒魔術へ入門するための案内書
Software
◦
Read more
40
Save
Share
Embed
Save to Drive
Download now
Download as PDF, PPTX
1
/ 35
2
/ 35
3
/ 35
4
/ 35
5
/ 35
6
/ 35
7
/ 35
8
/ 35
9
/ 35
10
/ 35
11
/ 35
12
/ 35
13
/ 35
14
/ 35
Most read
15
/ 35
16
/ 35
17
/ 35
18
/ 35
19
/ 35
20
/ 35
More Related Content
PDF
テスト文字列に「うんこ」と入れるな
by
Kentaro Matsui
16 slides
287.8K views
KEY
やはりお前らのMVCは間違っている
by
Koichi Tanaka
66 slides
153.6K views
PDF
例外設計における大罪
by
Takuto Wada
37 slides
76.9K views
PDF
【メタサーベイ】基盤モデル / Foundation Models
by
cvpaper. challenge
63 slides
20.6K views
PPTX
DockerコンテナでGitを使う
by
Kazuhiro Suga
8 slides
21.3K views
PDF
SQLアンチパターン 幻の第26章「とりあえず削除フラグ」
by
Takuto Wada
45 slides
174.7K views
PDF
何となく勉強した気分になれるパーサ入門
by
masayoshi takahashi
43 slides
37K views
PDF
プログラムを高速化する話
by
京大 マイコンクラブ
120 slides
268.3K views
テスト文字列に「うんこ」と入れるな
by
Kentaro Matsui
16 slides
287.8K views
やはりお前らのMVCは間違っている
by
Koichi Tanaka
66 slides
153.6K views
例外設計における大罪
by
Takuto Wada
37 slides
76.9K views
【メタサーベイ】基盤モデル / Foundation Models
by
cvpaper. challenge
63 slides
20.6K views
DockerコンテナでGitを使う
by
Kazuhiro Suga
8 slides
21.3K views
SQLアンチパターン 幻の第26章「とりあえず削除フラグ」
by
Takuto Wada
45 slides
174.7K views
何となく勉強した気分になれるパーサ入門
by
masayoshi takahashi
43 slides
37K views
プログラムを高速化する話
by
京大 マイコンクラブ
120 slides
268.3K views
What's hot
PDF
オブジェクト指向できていますか?
by
Moriharu Ohzu
129 slides
243.2K views
PDF
ARM CPUにおけるSIMDを用いた高速計算入門
by
Fixstars Corporation
114 slides
10.9K views
PDF
組み込み関数(intrinsic)によるSIMD入門
by
Norishige Fukushima
122 slides
51K views
PDF
最適化超入門
by
Takami Sato
80 slides
203.2K views
PDF
入門 Kubeflow ~Kubernetesで機械学習をはじめるために~ (NTT Tech Conference #4 講演資料)
by
NTT DATA Technology & Innovation
56 slides
7.8K views
PDF
Dockerfile を書くためのベストプラクティス解説編
by
Masahito Zembutsu
51 slides
90.6K views
PDF
ピクサー USD 入門 新たなコンテンツパイプラインを構築する
by
Takahito Tejima
74 slides
41.4K views
PDF
オブジェクト指向エクササイズのススメ
by
Yoji Kanno
85 slides
60.9K views
PDF
イミュータブルデータモデル(世代編)
by
Yoshitaka Kawashima
16 slides
40.7K views
PDF
20分くらいでわかった気分になれるC++20コルーチン
by
yohhoy
31 slides
15.3K views
PPTX
BuildKitによる高速でセキュアなイメージビルド
by
Akihiro Suda
27 slides
45.8K views
PDF
SSII2022 [TS1] Transformerの最前線〜 畳込みニューラルネットワークの先へ 〜
by
SSII
81 slides
4.1K views
PPT
メタプログラミングって何だろう
by
Kota Mizushima
16 slides
29.3K views
PDF
組織にテストを書く文化を根付かせる戦略と戦術
by
Takuto Wada
33 slides
77.9K views
PDF
プログラムを高速化する話Ⅱ 〜GPGPU編〜
by
京大 マイコンクラブ
184 slides
69.3K views
PDF
SSII2022 [SS2] 少ないデータやラベルを効率的に活用する機械学習技術 〜 足りない情報をどのように補うか?〜
by
SSII
40 slides
5.5K views
PDF
見やすいプレゼン資料の作り方 - リニューアル増量版
by
MOCKS | Yuta Morishige
77 slides
5.6M views
PDF
高速な倍精度指数関数expの実装
by
MITSUNARI Shigeo
20 slides
16.2K views
PDF
ChatGPTは思ったほど賢くない
by
Carnot Inc.
30 slides
7.9K views
PPTX
近年のHierarchical Vision Transformer
by
Yusuke Uchida
46 slides
17.9K views
オブジェクト指向できていますか?
by
Moriharu Ohzu
129 slides
243.2K views
ARM CPUにおけるSIMDを用いた高速計算入門
by
Fixstars Corporation
114 slides
10.9K views
組み込み関数(intrinsic)によるSIMD入門
by
Norishige Fukushima
122 slides
51K views
最適化超入門
by
Takami Sato
80 slides
203.2K views
入門 Kubeflow ~Kubernetesで機械学習をはじめるために~ (NTT Tech Conference #4 講演資料)
by
NTT DATA Technology & Innovation
56 slides
7.8K views
Dockerfile を書くためのベストプラクティス解説編
by
Masahito Zembutsu
51 slides
90.6K views
ピクサー USD 入門 新たなコンテンツパイプラインを構築する
by
Takahito Tejima
74 slides
41.4K views
オブジェクト指向エクササイズのススメ
by
Yoji Kanno
85 slides
60.9K views
イミュータブルデータモデル(世代編)
by
Yoshitaka Kawashima
16 slides
40.7K views
20分くらいでわかった気分になれるC++20コルーチン
by
yohhoy
31 slides
15.3K views
BuildKitによる高速でセキュアなイメージビルド
by
Akihiro Suda
27 slides
45.8K views
SSII2022 [TS1] Transformerの最前線〜 畳込みニューラルネットワークの先へ 〜
by
SSII
81 slides
4.1K views
メタプログラミングって何だろう
by
Kota Mizushima
16 slides
29.3K views
組織にテストを書く文化を根付かせる戦略と戦術
by
Takuto Wada
33 slides
77.9K views
プログラムを高速化する話Ⅱ 〜GPGPU編〜
by
京大 マイコンクラブ
184 slides
69.3K views
SSII2022 [SS2] 少ないデータやラベルを効率的に活用する機械学習技術 〜 足りない情報をどのように補うか?〜
by
SSII
40 slides
5.5K views
見やすいプレゼン資料の作り方 - リニューアル増量版
by
MOCKS | Yuta Morishige
77 slides
5.6M views
高速な倍精度指数関数expの実装
by
MITSUNARI Shigeo
20 slides
16.2K views
ChatGPTは思ったほど賢くない
by
Carnot Inc.
30 slides
7.9K views
近年のHierarchical Vision Transformer
by
Yusuke Uchida
46 slides
17.9K views
Similar to Pythonによる黒魔術入門
PPTX
メタプログラミングってなに?
by
KazukiWata
16 slides
175 views
PPTX
Scalamacrosについて
by
dekosuke
16 slides
473 views
PPTX
C#メタプログラミング概略 in 2021
by
Atsushi Nakamura
49 slides
1.2K views
PDF
Metaprogramming
by
Akura Pi
13 slides
833 views
PDF
Object-Functional Analysis and Design : 次世代モデリングパラダイムへの道標
by
Tomoharu ASAMI
39 slides
3.2K views
PDF
運用で爆発四散しないためのメタプログラミングとの付き合い方
by
Yuki Ishikawa
39 slides
1.6K views
PDF
オブジェクト指向開発におけるObject-Functional Programming
by
Tomoharu ASAMI
70 slides
6.3K views
PDF
Object-Funcational Analysis and design
by
Tomoharu ASAMI
33 slides
3.1K views
PDF
メタプログラミングとRuby
by
Kurume Institute of Technology
29 slides
3.1K views
PPTX
Eclipse modeling projectの概要
by
Shintaro Hosoai
32 slides
3.5K views
PDF
Object-Functional Analysis and Design and Programming温泉
by
Tomoharu ASAMI
29 slides
3.8K views
PDF
Deep learning reading club @ nimiri for SWEST
by
Kiyoshi Ogawa
50 slides
1.3K views
PDF
関数モデル 【クラウドアプリケーションのためのオブジェクト指向分析設計講座 第8回】
by
Tomoharu ASAMI
64 slides
354 views
PDF
普通のプログラミング言語R
by
Shuyo Nakatani
76 slides
5.2K views
メタプログラミングってなに?
by
KazukiWata
16 slides
175 views
Scalamacrosについて
by
dekosuke
16 slides
473 views
C#メタプログラミング概略 in 2021
by
Atsushi Nakamura
49 slides
1.2K views
Metaprogramming
by
Akura Pi
13 slides
833 views
Object-Functional Analysis and Design : 次世代モデリングパラダイムへの道標
by
Tomoharu ASAMI
39 slides
3.2K views
運用で爆発四散しないためのメタプログラミングとの付き合い方
by
Yuki Ishikawa
39 slides
1.6K views
オブジェクト指向開発におけるObject-Functional Programming
by
Tomoharu ASAMI
70 slides
6.3K views
Object-Funcational Analysis and design
by
Tomoharu ASAMI
33 slides
3.1K views
メタプログラミングとRuby
by
Kurume Institute of Technology
29 slides
3.1K views
Eclipse modeling projectの概要
by
Shintaro Hosoai
32 slides
3.5K views
Object-Functional Analysis and Design and Programming温泉
by
Tomoharu ASAMI
29 slides
3.8K views
Deep learning reading club @ nimiri for SWEST
by
Kiyoshi Ogawa
50 slides
1.3K views
関数モデル 【クラウドアプリケーションのためのオブジェクト指向分析設計講座 第8回】
by
Tomoharu ASAMI
64 slides
354 views
普通のプログラミング言語R
by
Shuyo Nakatani
76 slides
5.2K views
Pythonによる黒魔術入門
1.
第n回 XXX勉強会 小倉 大樹
2.
メタプログラミングによる 高次的コーディング技術 の 基礎を学ぶ 黒魔術入門 The Black Magic
3.
メタプログラミングとは ですが 大雑把に言えば 「コードを生成するコード」 「ロジックを生成するロジック」 「プログラミングそのものをプログラミングする行為」 のこと なるほどわからん
4.
なのでタイトルも「メタプログラミング入門」から「黒魔術入門」に変更しました 厳密に定義してスライドを作るのは面倒なので、 ! 今回のスライドでは 「コーディングそのものに関わる抽象的な言語機能」 を総称してメタプログラミングと呼びます。
5.
Caution!
6.
多用厳禁! メタプログラミングはロジックが抽象的で難解になる 場合によってはエラーの原因を追いにくくなる 意味不明なエラーが発生する どういう背景で動作しているのか理解しにくくなる そのメタプロ、必要ですか?
7.
うまく使えば強い武器になる。 特に、RubyやPythonを使うのであれば いずれも必須の知識(だと筆者は考える)。 Web Application FrameWork,
ORMapperなどの大規模なライブラリで あれば必ず使われているテクニック。 難解なメタレベルコーディングで厨二心を満たせ! とはいえ
8.
説明の前に
9.
諸注意 黒魔術が比較的易しい and 頻出
and メジャーな言語、などの理由から 今回の説明に使う言語はPythonです(筆者の知識の問題もあります)。 マクロについては、筆者のLisp力や抽象構文木に対する理解度不足などの 事情があるので今回は取り扱いません。 比較的に易しい内容を取り扱う予定ですが、最低限のオブジェクト指向と その言語内実装に対する理解度はあった方が良いかもしれません。
10.
Ghost Method 動的なメソッド呼び出し
11.
Ghost Method サンプルコード(動的な委譲) >>> class
DynamicProxy(object): ... def __init__(self, value): ... self._value = value ... ... def __getattr__(self, name): ... return getattr(self._value, name) ... ! >>> proc = DynamicProxy('hoge') >>> proc.title() 'Hoge'
12.
Ghost Method サンプルコード解説 def __getattr__(self,
name): pass __getattr__(Rubyではmethod_missing)を 実装したクラスに対して、実装されていないメソッド名での 呼び出しが行われた時に呼び出される。 name引数には呼ばれたときの名前が入る。
13.
Ghost Method 動的ディスパッチ解説 getattr(obj, name) getattr関数(RubyではObject#send) 対象オブジェクトに対して、与えられた文字列名での メソッド呼び出しを行う。 sendという名前はSmallTalkを意識してつけられたものか?
14.
Ghost Method 利用例 ORMapperのクエリビルダ find_by_column_nameをパースしてクエリを生成する……など ! APIクライアントの実装 APIを変更しても、ソースコードをいじる必要がなくなるような実装が可能 ! その他、使い道色々。
15.
高階関数 関数型のプログラミングスタイル メタプロと読んで良いかどうかは微妙だが、 ロジックを動的に生成するロジックとしては頻出する
16.
サンプルコード(動的な委譲) >>> from operator
import methodcaller ! >>> class NullSafeContainer(object): ... def __getattr__(self, name): ... def _(targ): ... if targ is None: ... return lambda *args, **kw: None ... return lambda *args, **kw: methodcaller(name, *args, **kw)(targ) ... return _ ... >>> ns = NullSafeContainer() >>> ns.replace('foo bar baz')('bar', 'gege') 'foo gege baz' >>> ns.replace(None)('bar', 'gege')
17.
サンプルコードの解説 Ghost Methodと組み合わせて、NullSafeな動的委譲を行う プロキシを実装している。 JavaScriptの勉強会でも書いたが、高階関数とレキシカルスコープ自体は 極基礎的な知識なので覚えよう。
18.
Monkey Patch オープンクラス
19.
Monkey Patch サンプルコード(動的な委譲) >>> class
Container(object): ... pass ... >>> c = Container() ! >>> def new_method(self, val): ... return val ... >>> # setattr(Container, 'new_method', new_method) >>> Container.new_method = new_method >>> c.new_method('new!') 'new!'
20.
Monkey Patch 解説 オープンクラスなどとも呼ばれ、実行時にクラスの実装を拡張するような機能。 ダックタイピングと組み合わせて使う強力な技。 しかし多用するとプロジェクトがカオスに陥る大変危険な機能であり、 Pythonでは利用しにくくなっている。 しかし、後述するメタクラスによる動的拡張などを行うための 基礎的な知識となる。 他にも、テスト系のライブラリではよく利用される。
21.
以下蛇足 Pythonではインスタンスへの動的なメソッド追加は出来ない。 >>> def new_instance_method(self,
val): ... return 'in instance "{0}"'.format(val) ... >>> # c.new_instance_method = new_instance_method >>> setattr(c, 'new_instance_method', new_instance_method) >>> c.new_instance_method('new!') Traceback (most recent call last): ... TypeError: new_instance_method() takes exactly 2 arguments (1 given)
22.
以下蛇足 しかしインターフェースを整えることは出来る >>> def demi_instance_dispatcher(instance,
method): ... setattr(instance, method.__name__, lambda *args, **kw: method(instance, *args, **kw)) ... >>> demi_instance_dispatcher(c, new_instance_method) >>> c.new_instance_method('new!') 'in instance "new!"'
23.
Descriptor ディスクリプター
24.
Descriptor 解説 Rubyに同様の機能が存在するかどうかは知らない。 オブジェクトの属性アクセス時の振る舞いをカスタマイズ出来るようになる機能。 property, classmethodなどの機能はこれで実現出来る。 時間がないので詳しい説明は割愛。
25.
Meta Class 黒魔術っぽくなってきた
26.
Meta Class その前に クラスの動的な生成 >>>
MyClass = type( ... 'MyClass', ... (object, ), ... { ... '__init__': lambda self, val: setattr(self, '_val', val), ... 'say': lambda self: self._val, ... }, ... ) >>> mc = MyClass('aaa') >>> mc.say() 'aaa'
27.
クラスの動的生成 解説 Pythonでは、type組み込み関数を使うことでクラスを動的に定義出来る。 class構文は、内部的には上記のtypeを呼び出しているのと同じだと言える。 そして、classが内部的に呼び出しているtypeを 別の関数で置き換えることが出来る。 ! この機能がメタクラスである。
28.
メタクラスの構文 >>> class MetaClassExample(type): ...
def __new__(cls, name, bases, dict): ... return type.__new__(cls, name, bases, dict) ... >>> class Klass(object): ... __metaclass__ = MetaClassExample 何もしない例
29.
メタクラスの構文 解説 Python2では __metaclass__ クラスメンバ。 Python3では
class SomeClass(metaclass=SomeMetaClass): のように定義。 例にある通り、 nameにはクラス名、 basesには基底クラス群、 dictにはオブジェクトの属性がそれぞれ入っている。 あとは好きにカスタマイズすれば良いわけです。
30.
メタクラスの活用例 >>> def _logging_hook(func): ...
def __(*args, **kw): ... print('before: {0}'.format(func.__name__)) ... ret = func(*args, **kw) ... print('after: {0}'.format(func.__name__)) ... return ret ... return __ ... 次ページへつづく こういう関数を用意しておいて……
31.
>>> from types
import ( ... MethodType, FunctionType, LambdaType ... ) >>> class LoggingHookKlass(type): ... def __new__(cls, name, bases, dict): ... hooked_attrs = { ... k: _logging_hook(v) ... for k, v in dict.items() ... if isinstance(v, (MethodType, FunctionType, LambdaType)) ... } ... return type.__new__(cls, name, bases, hooked_attrs) 次ページへつづく こういうメタクラスを作って
32.
>>> class Ninja(object): ...
__metaclass__ = LoggingHookKlass ... def aisatsu(self, other): ... print(‘ドーモ、{0}=サン’.format(other)) ... >>> ninja = Ninja() >>> ninja.aisatsu('オフェンダー') before: aisatsu ドーモ、オフェンダー=サン after: aisatsu 次ページで解説 こう使う
33.
メタクラス 解説 レシーバとして受け取った関数の実行前後にロギング(print文)を 実行する関数を容易して、 メタクラスを使って対象クラスの生成時に、全てのメソッドに対して 前述のロギングするラッパー関数をかませている。 ね、簡単でしょ?
34.
メタクラス 解説 出来ることは非常に多い。 が、サンプルのようなことをするのであればデコレータで良い。 使いどころを考えさせられる機能と言える。 より実践的な例だと https://github.com/hachibeeDI/forwardable.py とかが参考になるかも?
35.
おしまい 用法用量を守って楽しいコーディングを