Python Hub - сборище Питонистов
1.71K subscribers
657 photos
1 video
37 files
276 links
Уголок счастья для любого питониста.

Сотрудничество или заказы: @leshunist

https://shcoder.dev - студия разработки ShcoderDevelopment

https://t.me/pythonhub_chat - чат
Download Telegram
📝 Создание собственного DSL (Domain-Specific Language) на Python [ЧАСТЬ 2] 🧙‍♂️

🔎 3. Использование инструментов для создания DSL

Если вы хотите ускорить процесс создания 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)



➡️ Примеры реальных DSL на Python

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
👍4
Python Hub - сборище Питонистов
Photo
Разбор😎

Список lst по умолчанию создается один раз при определении функции, а не при каждом вызове.
Поэтому при первом вызове add_to_list(1) список становится [1], а при втором вызове add_to_list(2) к тому же списку добавляется 2, итог — [1, 2].

Это классическая ловушка с изменяемыми аргументами по умолчанию в Python.
👍61🤔1
Что выдаст код выше?
Anonymous Quiz
29%
1 2 3
17%
3 3 3
14%
0 1 2
22%
Ошибка
17%
Не знаю
🤔5👍31
Python Hub - сборище Питонистов
Photo
Разбор😎

Lambda-функции в списке захватывают переменную i из внешней области видимости , а не её значение на момент создания. После завершения цикла i становится равным 2 (последнее значение в range(3)).

Поэтому все функции используют i = 2, и результат для любого вызова funcs[n](1) будет 1 + 2 = 3.

Это типичная "ловушка" при работе с замыканиями в циклах.
👍41
Python Hub - сборище Питонистов
Photo
Разбор 😎

В Python списки — это изменяемые объекты. Когда мы присваиваем y = x, переменная y начинает ссылаться на тот же объект в памяти, что и x.

Поэтому любые изменения, сделанные через y, отразятся и на x. В данном случае вызов y.append(4) добавляет элемент 4 в конец списка, на который ссылаются обе переменные.

Таким образом, вывод будет [1, 2, 3, 4].
👍31
Что выдаст код выше?
Anonymous Quiz
47%
15 15
27%
10 15
10%
AttributeError
10%
10 10
6%
Не знаю
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.
👍51