DSL (Domain-Specific Language) — это специализированный язык программирования, созданный для решения узкоспециализированных задач. В отличие от общих языков программирования, таких как Python или JavaScript, DSL ориентирован на конкретную область применения: например, анализ данных, конфигурирование систем или управление бизнес-процессами.
Python идеально подходит для создания DSL благодаря своей гибкости и мощным возможностям метапрограммирования.
1. Упрощение задач: DSL позволяет описать сложные проблемы простым и понятным образом.
2. Доступность для неспециалистов: Специализированные языки могут быть более доступными для людей, не имеющих опыта в программировании.
3. Более читаемый код: DSL часто использует синтаксис, который ближе к предметной области, что делает код более понятным.
Примеры использования DSL:
- SQL для работы с базами данных.
- HTML/CSS для создания веб-страниц.
- Ansible для автоматизации администрирования.
Существует несколько подходов к созданию DSL на Python:
Вы можете использовать синтаксис Python для создания DSL, добавляя специализированные функции и классы. Этот подход называется "внутренним DSL" (Internal DSL).
Пример: Создание DSL для управления роботом
class Robot:
def move(self, distance):
print(f"Moving {distance} meters")
def turn(self, angle):
print(f"Turning {angle} degrees")
def robot_script():
robot = Robot()
robot.move(10)
robot.turn(90)
robot.move(5)
robot_script()
В этом примере мы создали простой DSL для управления роботом. Хотя это всё ещё Python, его синтаксис адаптирован под задачу.
Если вы хотите создать полностью самостоятельный язык, вам нужно реализовать парсер для обработки пользовательского синтаксиса. Этот подход называется "внешним DSL" (External DSL).
Шаги для создания External DSL:
1. Определите синтаксис вашего языка.
2. Напишите парсер для преобразования текста в структуры данных Python.
3. Реализуйте интерпретатор для выполнения этих структур.
Пример: Создание DSL для управления светофором
Предположим, мы хотим создать DSL для управления светофором. Его синтаксис может выглядеть так:
light red for 30 seconds
light green for 60 seconds
light yellow for 5 seconds
import re
class TrafficLight:
def __init__(self):
self.state = None
def set_light(self, color, duration):
print(f"Setting light to {color} for {duration} seconds")
self.state = color
def parse_script(script):
traffic_light = TrafficLight()
pattern = r"light (\w+) for (\d+) seconds"
for line in script.splitlines():
match = re.match(pattern, line)
if match:
color, duration = match.groups()
traffic_light.set_light(color, int(duration))
# Текст DSL
script = """
light red for 30 seconds
light green for 60 seconds
light yellow for 5 seconds
"""
parse_script(script)
Результат:
Setting light to red for 30 seconds
Setting light to green for 60 seconds
Setting light to yellow for 5 seconds
Please open Telegram to view this post
VIEW IN TELEGRAM
👍2❤1
Если вы хотите ускорить процесс создания DSL, можно использовать специализированные инструменты, такие как:
- PLY (Python Lex-Yacc): Библиотека для создания лексеров и парсеров.
- Lark: Современный парсер с простым синтаксисом.
- ANTLR: Мощный инструмент для создания DSL, поддерживающий множество языков.
Пример с Lark:
from lark import Lark, Transformer
# Грамматика DSL
grammar = """
start: command+
command: "light" COLOR "for" NUMBER "seconds"
COLOR: "red" | "green" | "yellow"
NUMBER: /\d+/
%import common.WS
%ignore WS
"""
# Парсер
parser = Lark(grammar, start="start", parser="lalr", transformer=Transformer())
class TrafficLightTransformer(Transformer):
def command(self, items):
color, duration = items
print(f"Setting light to {color} for {duration} seconds")
return {"color": color, "duration": duration}
def COLOR(self, token):
return str(token)
def NUMBER(self, token):
return int(token)
# Текст DSL
script = """
light red for 30 seconds
light green for 60 seconds
"""
# Парсинг и выполнение
parsed = parser.parse(script)
1. Django ORM: Язык запросов для работы с базами данных.
2. Pandas Query API: DSL для фильтрации и анализа данных.
3. Ansible Playbooks: DSL для автоматизации серверных задач.
4. SQLAlchemy: DSL для работы с базами данных на уровне Python.
Создание DSL на Python — это мощный инструмент для решения узкоспециализированных задач. Вы можете выбрать между внутренними и внешними DSL в зависимости от ваших потребностей. Если вам нужна простота реализации, используйте Internal DSL, а если требуется полная свобода в создании синтаксиса, выбирайте External DSL.
🌟 Попробуйте создать свой DSL прямо сейчас и сделайте работу над вашими проектами проще!
Please open Telegram to view this post
VIEW IN TELEGRAM
❤2
ГПТ без VPN да еще и с бесплатным подключением к Python без ключей через импорт. Ну сказка.
Attention. Звук оповещалки и колокольчика не уменьшен, будет орать в ушах. Простите
https://youtu.be/fnffEWuA0FQ
Please open Telegram to view this post
VIEW IN TELEGRAM
YouTube
БЕСПЛАТНО подключить GPT в PYTHON | С генерацией картинок
В этом видео мы посмотрим библиотеку, которую можно использовать для бесплатного общения с нейросетью chat gpt. Там представлена возможость общаться с gpt4o, gpt4o-mini, генерировать картинки, открыть чат с нейросетью в бразуере в UI.
🔥 Подписывайся на наш…
🔥 Подписывайся на наш…
👍4
Давно не было от меня вестей, сорри!😔
Но надеюсь такой интересный и полезный видос загладит мою вину)
https://youtu.be/2DZYp1LEmGo
Но надеюсь такой интересный и полезный видос загладит мою вину)
https://youtu.be/2DZYp1LEmGo
YouTube
WEBAPP в TELEGRAM на PYTHON | TODO LIST MiniApp на Streamlit
В этом видео мы разберемся, как создать телеграм webapp приложение. Этот MiniApp мы разработаем на библиотеке Streamlit и подключим к AIOgram для отображения. Суть проекта - todo list (список задач)
🔥 Подписывайся на наш Телеграм-канал про Python 🔥
🖇 ht…
🔥 Подписывайся на наш Телеграм-канал про Python 🔥
🖇 ht…
👍4
Го смотреть
Скорее всего на этой либе сделаю курс по созданию WebApp приложения😮😮😮
https://youtu.be/jkedRnLTEbc
Скорее всего на этой либе сделаю курс по созданию WebApp приложения😮😮😮
https://youtu.be/jkedRnLTEbc
YouTube
Flet - Python библиотека будущего? Telegram MiniApps, ios, android, windows | Flutter
✅В этом видео вы узнаете, как библиотека Flet меняет правила игры в кроссплатформенной разработке!
✅Она позваоляет создавать приложения для iOS, Android, Windows и Telegram MiniApps на Python за минуты.
✅Рассмотрим пример MiniApp приложения на флет (Telegram…
✅Она позваоляет создавать приложения для iOS, Android, Windows и Telegram MiniApps на Python за минуты.
✅Рассмотрим пример MiniApp приложения на флет (Telegram…
👍9❤2
Что выдаст код выше?
Anonymous Quiz
39%
[1] и [2]
27%
[1] и [1, 2]
12%
[1, 2] и [1, 2]
16%
Ошибка
7%
Не знаю
👍5❤1
Python Hub - сборище Питонистов
Photo
Разбор😎
Список lst по умолчанию создается один раз при определении функции, а не при каждом вызове.
Поэтому при первом вызове add_to_list(1) список становится [1], а при втором вызове add_to_list(2) к тому же списку добавляется 2, итог — [1, 2].
Это классическая ловушка с изменяемыми аргументами по умолчанию в Python.
Поэтому при первом вызове add_to_list(1) список становится [1], а при втором вызове add_to_list(2) к тому же списку добавляется 2, итог — [1, 2].
Это классическая ловушка с изменяемыми аргументами по умолчанию в Python.
👍6❤1🤔1
🤔5👍3❤1
Python Hub - сборище Питонистов
Photo
Разбор😎
Lambda-функции в списке захватывают переменную i из внешней области видимости , а не её значение на момент создания. После завершения цикла i становится равным 2 (последнее значение в range(3)).
Поэтому все функции используют i = 2, и результат для любого вызова funcs[n](1) будет 1 + 2 = 3.
Это типичная "ловушка" при работе с замыканиями в циклах.
Поэтому все функции используют i = 2, и результат для любого вызова funcs[n](1) будет 1 + 2 = 3.
Это типичная "ловушка" при работе с замыканиями в циклах.
👍4❤1
Что выдаст код выше?
Anonymous Quiz
27%
[1, 2, 3]
52%
[1, 2, 3, 4]
10%
[4, 1, 2, 3]
8%
Ошибка
2%
Не знаю
👍6❤1
Python Hub - сборище Питонистов
Photo
Разбор 😎
В Python списки — это изменяемые объекты. Когда мы присваиваем y = x, переменная y начинает ссылаться на тот же объект в памяти, что и x.
Поэтому любые изменения, сделанные через y, отразятся и на x. В данном случае вызов y.append(4) добавляет элемент 4 в конец списка, на который ссылаются обе переменные.
Таким образом, вывод будет [1, 2, 3, 4].
Поэтому любые изменения, сделанные через y, отразятся и на x. В данном случае вызов y.append(4) добавляет элемент 4 в конец списка, на который ссылаются обе переменные.
Таким образом, вывод будет [1, 2, 3, 4].
👍3❤1
❤2👍2
Python Hub - сборище Питонистов
Photo
Разбор 😎
Здесь мы имеем дело с объектами и ссылками в Python. Когда создается объект класса A (a = A()), переменная a ссылается на этот объект. Затем переменной b присваивается ссылка на тот же объект (b = a). Это означает, что a и b ссылаются на один и тот же объект в памяти.
Когда вызывается метод update через переменную b, он изменяет атрибут x этого объекта, увеличивая его значение на 5. Поскольку a и b ссылаются на один и тот же объект, изменение видно через обе переменные. Таким образом, после выполнения b.update(5) значение x становится равным 15, и вывод будет 15 15.
Здесь мы имеем дело с объектами и ссылками в Python. Когда создается объект класса A (a = A()), переменная a ссылается на этот объект. Затем переменной b присваивается ссылка на тот же объект (b = a). Это означает, что a и b ссылаются на один и тот же объект в памяти.
Когда вызывается метод update через переменную b, он изменяет атрибут x этого объекта, увеличивая его значение на 5. Поскольку a и b ссылаются на один и тот же объект, изменение видно через обе переменные. Таким образом, после выполнения b.update(5) значение x становится равным 15, и вывод будет 15 15.
👍5❤1