Python DSL:特殊なドメインに合わせたソリューション
プログラムを作成すると、解決する問題が次のような特定の領域 (ドメインとも呼ばれます) に属していることがわかります。
- 銀行システムでは、トランザクションや金利を記述する必要があります。
- ウェブ アプリケーションではルート、テンプレート、レスポンスを定義する必要があります。
Python や Java などの汎用言語 (GPL) を使用すると、これらの問題を解決できますが、コードが詳細になりすぎ、繰り返しが多くなります。したがって、DSL (ドメイン固有言語) を使用します。
DSL - ドメイン固有言語
ドメイン固有言語は、特定のドメイン専用のプログラミングまたは仕様言語です。汎用言語 (Python、C++、Java などの GPL) とは異なります。これらには 2 つのタイプがあります:
- 外部 DSL − 独自の構文とコンパイラを備えた完全に新しい言語
- 内部 DSL (埋め込み DSL) - ホスト言語の構文と構造を使用して、ホスト言語内に構築された DSL。
外部 DSL
データベースを操作する場合、SQL を使用します。データを手動でスキャンするループを作成する代わりに、単純に次のように記述します。
SELECT name FROM users WHERE age > 10;
ウェブページのデザインには HTML を使用します。テキストと位置の文字列を手動で管理する代わりに、単に次のように宣言します。
<h1>Welcome To Tutorialspoint</h1>
内部 DSL
Python では、ドメイン固有言語は Python 構文の上に構築されます。 flask や Pandas などのフレームワークは、問題を明確に表現するのに役立つ DSL のようなライブラリの例です。
@app.route('/home')
def home():
return "Hello...!"
Python で DSL を使用する理由
Python は次の理由から DSL に最適な選択です。
- その構文はシンプルで表現力豊かです。
- 関数とクラスを構成要素として使用できるようにします。
たとえば、pytest などのテスト フレームワークや Flask などの Web フレームワークは DSL に似ています。低レベルのロジックを記述する代わりに、表現力豊かなコマンドを記述できるようにしています。
ドメイン固有言語についてさらに詳しく学ぶために、例を見てみましょう。
例 1
次の例を見てみましょう。ここでは、数学の言語を名前付き関数に抽象化します。
def add(x, y): return x + y def multiply(x, y): return x * y print(add(multiply(1, 3), multiply(2, 4)))
以下は、上記のプログラムの出力です -
11
例 2
次の例を考えてみましょう。設定ファイルで DSL を使用します。
class demo:
def __init__(self):
self.settings = {}
def set(self, key, value):
self.settings[key] = value
return self
def get(self, key):
return self.settings.get(key)
result = demo()
result.set("host", "Welcome").set("port", 1231)
print(result.get("host"))
上記のプログラムの出力は次のとおりです -
Welcome
例 3
次の例では、Python 内の SQL 構文を使用してデータをクエリするための DSL を観察します。
class demo:
def __init__(x, dataset):
x.dataset = dataset
def where(x, condition):
x.dataset = [item for item in x.dataset if condition(item)]
return x
def select(x, selector):
return [selector(item) for item in x.dataset]
users = [
{"name": "Ram", "age": 10},
{"name": "Ravi", "age": 24},
{"name": "Rahul", "age": 19},
]
result = demo(users).where(lambda u: u["age"] > 18).select(lambda u: u["name"])
print(result)
以下は、上記のプログラムの出力です -
['Ravi', 'Rahul']
Python
- Python 変数、定数、およびリテラル
- Python while ループ
- Python - GUI プログラミング (Tkinter)
- PyTest チュートリアル:概要、インストール方法、フレームワーク、アサーション
- Python 開発者専用の Real Python Slack コミュニティに参加しましょう
- Python でスレッド間通信をマスターする:同期とデータ共有
- Python の例外処理:try、catch、finally、raise [例]
- Python デコレータ
- Python Get 現在時刻
- Python 文字列:置換、結合、分割、反転、大文字と小文字
- Python イテレータ