rupython 1.2.7__tar.gz → 1.2.9__tar.gz

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (19) hide show
  1. {rupython-1.2.7 → rupython-1.2.9}/PKG-INFO +2 -2
  2. {rupython-1.2.7 → rupython-1.2.9}/README.md +1 -1
  3. {rupython-1.2.7 → rupython-1.2.9}/rupython//320/234/320/276/320/264/321/203/320/273/320/270//320/221/320/224.py +94 -57
  4. rupython-1.2.9/rupython//320/234/320/276/320/264/321/203/320/273/320/270//320/232/320/276/320/273/320/273/320/265/320/272/321/206/320/270/320/270.py +426 -0
  5. {rupython-1.2.7 → rupython-1.2.9}/rupython.egg-info/PKG-INFO +2 -2
  6. {rupython-1.2.7 → rupython-1.2.9}/rupython.egg-info/SOURCES.txt +1 -0
  7. {rupython-1.2.7 → rupython-1.2.9}/setup.py +1 -1
  8. {rupython-1.2.7 → rupython-1.2.9}/LICENSE +0 -0
  9. {rupython-1.2.7 → rupython-1.2.9}/rupython/__main__.py +0 -0
  10. {rupython-1.2.7 → rupython-1.2.9}/rupython/__/320/227/320/260/320/263/320/276/320/273/320/276/320/262/320/276/321/207/320/275/321/213/320/271_/320/272/320/276/320/264__.py" +0 -0
  11. {rupython-1.2.7 → rupython-1.2.9}/rupython/__/320/236/320/261/321/211/320/270/320/265_/321/204/321/203/320/275/320/272/321/206/320/270/320/270__.py" +0 -0
  12. {rupython-1.2.7 → rupython-1.2.9}/rupython//320/234/320/276/320/264/321/203/320/273/320/270//320/224/320/260/321/202/320/260/320/222/321/200/320/265/320/274/321/217.py" +0 -0
  13. {rupython-1.2.7 → rupython-1.2.9}/rupython//320/234/320/276/320/264/321/203/320/273/320/270//320/234/320/260/321/202/320/265/320/274.py" +0 -0
  14. {rupython-1.2.7 → rupython-1.2.9}/rupython//320/234/320/276/320/264/321/203/320/273/320/270//320/240/320/265/320/263/320/222/321/213/321/200.py" +0 -0
  15. {rupython-1.2.7 → rupython-1.2.9}/rupython//320/234/320/276/320/264/321/203/320/273/320/270//320/241/320/273/321/203/321/207.py" +0 -0
  16. {rupython-1.2.7 → rupython-1.2.9}/rupython//320/237/321/200/320/265/320/276/320/261/321/200/320/260/320/267/320/276/320/262/320/260/321/202/320/265/320/273/321/214.py" +0 -0
  17. {rupython-1.2.7 → rupython-1.2.9}/rupython.egg-info/dependency_links.txt +0 -0
  18. {rupython-1.2.7 → rupython-1.2.9}/rupython.egg-info/top_level.txt +0 -0
  19. {rupython-1.2.7 → rupython-1.2.9}/setup.cfg +0 -0
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.1
2
2
  Name: rupython
3
- Version: 1.2.7
3
+ Version: 1.2.9
4
4
  Summary: Исполнитель кода Русского Питона
5
5
  Description-Content-Type: text/markdown
6
6
  License-File: LICENSE
@@ -16,7 +16,7 @@ License-File: LICENSE
16
16
 
17
17
  Алгоритмические языки на русской лексической базе повышают производительность труда разработчиков, поскольку работа на знакомом языке не требует от них приложения ненужных умственных усилий для переключения на иностранный язык, чем снижается когнитивная нагрузка, улучшается читаемость и качество создаваемого кода и повышается эффективность коммуникации в команде. Русский код априори является более понятным и воспринимаемым интуитивно в контексте культурных и языковых особенностей русских людей, снижая порог вхождения и устраняя искусственный барьер в виде необходимости овладения иностранным языком на уровне, достаточном для беглого чтения кода.
18
18
 
19
- Приложения на Русском Питоне могут использовать все возможности оригинального Python, включая всё богатство подключаемых пакетов и библиотек. Код может быть написан на обоих вариантах языка.
19
+ Приложения на Русском Питоне могут использовать все возможности оригинального Python, включая всё богатство подключаемых пакетов и библиотек. Код может быть написан на обоих вариантах языка. Технически инструмент представляет собой сочетание собственно транслятора кода Русского Питона в оригинальный Python с модулем, модифицирующим встроенные объекты, а также обёртками над модулями стандартной библиотеки.
20
20
 
21
21
  ### Установка
22
22
 
@@ -9,7 +9,7 @@
9
9
 
10
10
  Алгоритмические языки на русской лексической базе повышают производительность труда разработчиков, поскольку работа на знакомом языке не требует от них приложения ненужных умственных усилий для переключения на иностранный язык, чем снижается когнитивная нагрузка, улучшается читаемость и качество создаваемого кода и повышается эффективность коммуникации в команде. Русский код априори является более понятным и воспринимаемым интуитивно в контексте культурных и языковых особенностей русских людей, снижая порог вхождения и устраняя искусственный барьер в виде необходимости овладения иностранным языком на уровне, достаточном для беглого чтения кода.
11
11
 
12
- Приложения на Русском Питоне могут использовать все возможности оригинального Python, включая всё богатство подключаемых пакетов и библиотек. Код может быть написан на обоих вариантах языка.
12
+ Приложения на Русском Питоне могут использовать все возможности оригинального Python, включая всё богатство подключаемых пакетов и библиотек. Код может быть написан на обоих вариантах языка. Технически инструмент представляет собой сочетание собственно транслятора кода Русского Питона в оригинальный Python с модулем, модифицирующим встроенные объекты, а также обёртками над модулями стандартной библиотеки.
13
13
 
14
14
  ### Установка
15
15
 
@@ -8,7 +8,6 @@ import re as РегВыр
8
8
  Успешно = sqlite3.SQLITE_OK
9
9
  Отказ = sqlite3.SQLITE_DENY
10
10
  Игнорировать = sqlite3.SQLITE_IGNORE
11
- Уровень_интерфейса_взаимодействия = sqlite3.apilevel
12
11
  Стиль_параметров = sqlite3.paramstyle
13
12
  Потокобезопасность = sqlite3.threadsafety
14
13
 
@@ -23,7 +22,6 @@ import re as РегВыр
23
22
  'ОТКАТИТЬ': 'ROLLBACK',
24
23
  'ТОЧКА_СОХРАНЕНИЯ': 'SAVEPOINT',
25
24
  'НАСТРОИТЬ': 'PRAGMA',
26
-
27
25
  'ВЫБРАТЬ': 'SELECT',
28
26
  'ИЗ': 'FROM',
29
27
  'ГДЕ': 'WHERE',
@@ -49,7 +47,6 @@ import re as РегВыр
49
47
  'ПО': 'ON',
50
48
  'ПЕРЕКРЁСТНО': 'CROSS',
51
49
  'ИСПОЛЬЗУЯ': 'USING',
52
-
53
50
  'ВСТАВИТЬ ИЛИ ___ В': 'INSERT OR ___ INTO',
54
51
  'ДОБАВИТЬ В': 'INSERT INTO',
55
52
  'ЗНАЧЕНИЯ': 'VALUES',
@@ -64,7 +61,6 @@ import re as РегВыр
64
61
  'ЗАМЕНИТЬ': 'REPLACE',
65
62
  'ОТКАТИТЬ': 'ROLLBACK',
66
63
  'СБОЙ': 'FAIL',
67
-
68
64
  'ИЗМЕНИТЬ ТАБЛИЦУ': 'ALTER TABLE',
69
65
  'ИЗМЕНИТЬ СТОЛБЕЦ': 'ALTER COLUMN',
70
66
  'СОЗДАТЬ': 'CREATE',
@@ -81,7 +77,6 @@ import re as РегВыр
81
77
  'СТОЛБЕЦ': 'COLUMN',
82
78
  'ТРИГГЕР': 'TRIGGER',
83
79
  'СТРОГО': 'STRICT',
84
-
85
80
  'ЯВЛЯЕТСЯ ПУСТЫМ': 'IS NULL',
86
81
  'НЕ ЯВЛЯЕТСЯ ПУСТЫМ': 'IS NOT NULL',
87
82
  'НЕ ПУСТОЕ': 'NOT NULL',
@@ -95,14 +90,12 @@ import re as РегВыр
95
90
  'ЕСЛИ': 'IF',
96
91
  'СУЩЕСТВУЕТ': 'EXISTS',
97
92
  'БЕЗ': 'WITHOUT',
98
-
99
93
  'ОПРЕДЕЛИВ': 'WITH',
100
94
  'ВЫБОР': 'CASE',
101
95
  'ПРИ': 'WHEN',
102
96
  'ЭТО': 'THEN',
103
97
  'КОНЕЦ': 'END',
104
98
  'РЕКУРСИВНО': 'RECURSIVE',
105
-
106
99
  'ЦЕЛОЕ': 'INTEGER',
107
100
  'ВЕЩЕСТВЕННОЕ': 'REAL',
108
101
  'ТЕКСТ': 'TEXT',
@@ -111,7 +104,6 @@ import re as РегВыр
111
104
  'ВРЕМЯ': 'TIME',
112
105
  'ВРЕМЕННАЯ_МЕТКА': 'TIMESTAMP',
113
106
  'ЛОГИЧЕСКОЕ': 'BOOLEAN',
114
-
115
107
  'КЛЮЧ': 'KEY',
116
108
  'ПЕРВИЧНЫЙ': 'PRIMARY',
117
109
  'ВНЕШНИЙ': 'FOREIGN',
@@ -122,7 +114,6 @@ import re as РегВыр
122
114
  'ПО_УМОЛЧАНИЮ': 'DEFAULT',
123
115
  'САМОУВЕЛИЧИВАЮЩЕЕСЯ': 'AUTOINCREMENT',
124
116
  'ССЫЛАЕТСЯ НА': 'REFERENCES',
125
-
126
117
  'ОТОБРАВ': 'FILTER',
127
118
  'КОЛИЧЕСТВО': 'COUNT',
128
119
  'СУММА': 'SUM',
@@ -146,7 +137,6 @@ import re as РегВыр
146
137
  'ГОД': 'YEAR',
147
138
  'МЕСЯЦ': 'MONTH',
148
139
  'ДЕНЬ': 'DAY',
149
-
150
140
  'СЛУЧАЙНОЕ': 'RANDOM',
151
141
  'ТИП_ДАННЫХ': 'TYPEOF',
152
142
  'ПОСЛЕДНИЙ_ИДЕНТИФИКАТОР': 'LAST_INSERT_ROWID',
@@ -169,7 +159,6 @@ import re as РегВыр
169
159
  'ВЫЧИСЛИТЬ_ХЭШ': 'HEX',
170
160
  'ЗАКОДОВАТЬ_64': 'BASE64',
171
161
  'РАСКОДОВАТЬ_64': 'UNBASE64',
172
-
173
162
  'ВКЛЮЧЕНО': 'ON',
174
163
  'ОТКЛЮЧЕНО': 'OFF',
175
164
  'Синхронизация': 'synchronous',
@@ -208,6 +197,11 @@ def Получить_токены(запрос):
208
197
  while i < len(запрос):
209
198
  символ = запрос[i]
210
199
 
200
+ if символ == '\\' and в_строке and i + 1 < len(запрос):
201
+ текущий_токен += символ + запрос[i + 1]
202
+ i += 2
203
+ continue
204
+
211
205
  if символ in ('"', "'") and not в_комментарии:
212
206
  if в_строке and символ == строка_символ:
213
207
  в_строке = False
@@ -275,10 +269,10 @@ def Получить_токены(запрос):
275
269
 
276
270
  текущий_токен += символ
277
271
  i += 1
278
-
272
+
279
273
  if текущий_токен:
280
274
  токены.append(текущий_токен)
281
-
275
+
282
276
  return токены
283
277
 
284
278
  def Перевести_токены(токены):
@@ -313,7 +307,7 @@ def Перевести_токены(токены):
313
307
  i += длина
314
308
  найдено_ключевое_слово = True
315
309
  break
316
-
310
+
317
311
  if найдено_ключевое_слово:
318
312
  break
319
313
 
@@ -322,17 +316,7 @@ def Перевести_токены(токены):
322
316
  i += длина
323
317
  найдено_ключевое_слово = True
324
318
  break
325
-
326
- if not найдено_ключевое_слово:
327
- # Специальная обработка для значений PRAGMA
328
- if токен.upper() == 'ДА':
329
- переведённые_токены.append('ON')
330
- elif токен.upper() == 'НЕТ':
331
- переведённые_токены.append('OFF')
332
- else:
333
- переведённые_токены.append(токен)
334
- i += 1
335
-
319
+
336
320
  return переведённые_токены
337
321
 
338
322
  def Собрать_запрос(токены):
@@ -354,7 +338,7 @@ def Перевести_код_запроса(текст):
354
338
 
355
339
  Переводы_ошибок = {
356
340
  r"no such table: (.+)": r'Таблица "\1" не существует.',
357
- r"database is locked": r'База данных заблокована.',
341
+ r"database is locked": r'База данных заблокирована.',
358
342
  r"near \"(.+)\": syntax error": r'Синтаксическая ошибка около "\1".',
359
343
  r"table (.+) already exists": r'Таблица "\1" уже существует.',
360
344
  r"no such column: (.+)": r'Столбец "\1" не существует.',
@@ -365,7 +349,7 @@ def Перевести_код_запроса(текст):
365
349
  r"no such index: (.+)": r'Индекс "\1" не существует.',
366
350
  r"too many SQL variables": r'Слишком много переменных в запросе.',
367
351
  r"maximum recursion depth exceeded": r'Превышена максимальная глубина рекурсии в запросе.',
368
- r"no such database: (.+)": r'База данных "\1" не существует.', # Добавлено
352
+ r"no such database: (.+)": r'База данных "\1" не существует.',
369
353
  r"incomplete input": r'Неполный запрос.',
370
354
  r"malformed database schema \((.+)\)": r'Некорректная схема базы данных: \1.',
371
355
  r"file is not a database": r'Файл не является базой данных.',
@@ -415,39 +399,58 @@ class Указатель():
415
399
  try:
416
400
  запрос = Перевести_код_запроса(запрос)
417
401
  здесь._курсор.execute(запрос, параметры)
418
- except Ошибка as ош: raise Ошибка(Перевести_ошибку(ош)) from ош
402
+ except Ошибка as ош:
403
+ raise Ошибка(Перевести_ошибку(ош)) from ош
419
404
 
420
405
  def Выполнить_запросы(здесь, запрос, последовательность_параметров):
421
406
  try:
422
407
  запрос = Перевести_код_запроса(запрос)
423
408
  здесь._курсор.executemany(запрос, последовательность_параметров)
424
- except Ошибка as ош: raise Ошибка(Перевести_ошибку(ош)) from ош
409
+ except Ошибка as ош:
410
+ raise Ошибка(Перевести_ошибку(ош)) from ош
425
411
 
426
412
  def Выполнить_сценарий(здесь, сценарий):
427
413
  try:
428
414
  скрипт = Перевести_код_запроса(сценарий)
429
415
  здесь._курсор.executescript(скрипт)
430
- except Ошибка as ош: raise Ошибка(Перевести_ошибку(ош)) from ош
416
+ except Ошибка as ош:
417
+ raise Ошибка(Перевести_ошибку(ош)) from ош
431
418
 
432
419
  def Извлечь_запись(здесь):
433
- return здесь._курсор.fetchone()
420
+ try:
421
+ return здесь._курсор.fetchone()
422
+ except Ошибка as ош:
423
+ raise Ошибка(Перевести_ошибку(ош)) from ош
434
424
 
435
425
  def Извлечь_записи(здесь, количество):
436
- return здесь._курсор.fetchmany(количество)
426
+ try:
427
+ return здесь._курсор.fetchmany(количество)
428
+ except Ошибка as ош:
429
+ raise Ошибка(Перевести_ошибку(ош)) from ош
437
430
 
438
431
  def Извлечь_все_записи(здесь):
439
- return здесь._курсор.fetchall()
432
+ try:
433
+ return здесь._курсор.fetchall()
434
+ except Ошибка as ош:
435
+ raise Ошибка(Перевести_ошибку(ош)) from ош
440
436
 
441
- def Закрыть(здесь): здесь._курсор.close()
437
+ def Закрыть(здесь):
438
+ try:
439
+ здесь._курсор.close()
440
+ except Ошибка as ош:
441
+ raise Ошибка(Перевести_ошибку(ош)) from ош
442
442
 
443
443
  @property
444
- def Описание(здесь): return здесь._курсор.description
444
+ def Описание(здесь):
445
+ return здесь._курсор.description
445
446
 
446
447
  @property
447
- def Количество_строк(здесь): return здесь._курсор.rowcount
448
+ def Количество_строк(здесь):
449
+ return здесь._курсор.rowcount
448
450
 
449
451
  @property
450
- def Последний_идентификатор(здесь): return здесь._курсор.lastrowid
452
+ def Последний_идентификатор(здесь):
453
+ return здесь._курсор.lastrowid
451
454
 
452
455
  class Соединение():
453
456
  def __init__(здесь,
@@ -474,63 +477,97 @@ class Соединение():
474
477
  cached_statements=кэш_инструкций,
475
478
  uri=является_ссылкой
476
479
  )
477
- except Ошибка as ош: raise Ошибка(Перевести_ошибку(ош)) from ош
480
+ except Ошибка as ош:
481
+ raise Ошибка(Перевести_ошибку(ош)) from ош
482
+
483
+ def __enter__(здесь):
484
+ return здесь
485
+
486
+ def __exit__(здесь, exc_type, exc_value, traceback):
487
+ здесь.Закрыть()
478
488
 
479
489
  def Создать_указатель(здесь):
480
490
  try:
481
491
  курсор = здесь._соединение.cursor()
482
492
  return Указатель(курсор)
483
- except Ошибка as ош: raise Ошибка(Перевести_ошибку(ош)) from ош
493
+ except Ошибка as ош:
494
+ raise Ошибка(Перевести_ошибку(ош)) from ош
484
495
 
485
496
  def Выполнить_запрос(здесь, запрос, параметры=()):
486
497
  try:
487
498
  запрос = Перевести_код_запроса(запрос)
488
499
  указатель = здесь._соединение.execute(запрос, параметры)
489
500
  return Указатель(указатель)
490
- except Ошибка as ош: raise Ошибка(Перевести_ошибку(ош)) from ош
501
+ except Ошибка as ош:
502
+ raise Ошибка(Перевести_ошибку(ош)) from ош
491
503
 
492
504
  def Выполнить_запросы(здесь, запрос, параметры):
493
505
  try:
494
506
  запрос = Перевести_код_запроса(запрос)
495
507
  указатель = здесь._соединение.executemany(запрос, параметры)
496
508
  return Указатель(указатель)
497
- except Ошибка as ош: raise Ошибка(Перевести_ошибку(ош)) from ош
509
+ except Ошибка as ош:
510
+ raise Ошибка(Перевести_ошибку(ош)) from ош
498
511
 
499
512
  def Выполнить_сценарий(здесь, сценарий):
500
513
  try:
501
514
  скрипт = Перевести_код_запроса(сценарий)
502
515
  здесь._соединение.executescript(скрипт)
503
- except Ошибка as ош: raise Ошибка(Перевести_ошибку(ош)) from ош
516
+ except Ошибка as ош:
517
+ raise Ошибка(Перевести_ошибку(ош)) from ош
504
518
 
505
519
  def Создать_функцию(здесь, имя, количество_параметров, функция):
506
- try: здесь._соединение.create_function(имя, количество_параметров, функция)
507
- except Ошибка as ош: raise Ошибка(Перевести_ошибку(ош)) from ош
520
+ try:
521
+ здесь._соединение.create_function(имя, количество_параметров, функция)
522
+ except Ошибка as ош:
523
+ raise Ошибка(Перевести_ошибку(ош)) from ош
508
524
 
509
525
  def Создать_агрегатную_функцию(здесь, имя, число_аргументов, класс):
510
- try: здесь._соединение.create_aggregate(имя, число_аргументов, класс)
511
- except Ошибка as ош: raise Ошибка(Перевести_ошибку(ош)) from ош
526
+ try:
527
+ здесь._соединение.create_aggregate(имя, число_аргументов, класс)
528
+ except Ошибка as ош:
529
+ raise Ошибка(Перевести_ошибку(ош)) from ош
512
530
 
513
531
  def Создать_сопоставление(здесь, имя, функция):
514
- try: здесь._соединение.create_collation(имя, функция)
515
- except Ошибка as ош: raise Ошибка(Перевести_ошибку(ош)) from ош
532
+ try:
533
+ здесь._соединение.create_collation(имя, функция)
534
+ except Ошибка as ош:
535
+ raise Ошибка(Перевести_ошибку(ош)) from ош
536
+
537
+ def Прервать(здесь):
538
+ try:
539
+ здесь._соединение.interrupt()
540
+ except Ошибка as ош:
541
+ raise Ошибка(Перевести_ошибку(ош)) from ош
516
542
 
517
543
  def Закрыть(здесь):
518
- try: здесь._соединение.close()
519
- except Ошибка as ош: raise Ошибка(Перевести_ошибку(ош)) from ош
544
+ try:
545
+ здесь._соединение.close()
546
+ except Ошибка as ош:
547
+ raise Ошибка(Перевести_ошибку(ош)) from ош
520
548
 
521
549
  def Утвердить(здесь):
522
- try: здесь._соединение.commit()
523
- except Ошибка as ош: raise Ошибка(Перевести_ошибку(ош)) from ош
550
+ try:
551
+ здесь._соединение.commit()
552
+ except Ошибка as ош:
553
+ raise Ошибка(Перевести_ошибку(ош)) from ош
524
554
 
525
555
  def Откатить(здесь):
526
- try: здесь._соединение.rollback()
527
- except Ошибка as ош: raise Ошибка(Перевести_ошибку(ош)) from ош
556
+ try:
557
+ здесь._соединение.rollback()
558
+ except Ошибка as ош:
559
+ raise Ошибка(Перевести_ошибку(ош)) from ош
528
560
 
529
561
  @property
530
- def В_транзакции(здесь): return здесь._соединение.in_transaction
562
+ def В_транзакции(здесь):
563
+ return здесь._соединение.in_transaction
531
564
 
532
565
  @property
533
- def Изоляция(здесь): return здесь._соединение.isolation_level
566
+ def Изоляция(здесь):
567
+ return здесь._соединение.isolation_level
534
568
 
535
569
  @Изоляция.setter
536
- def Изоляция(здесь, значение): здесь._соединение.isolation_level = значение
570
+ def Изоляция(здесь, значение):
571
+ if значение not in (None, 'DEFERRED', 'IMMEDIATE', 'EXCLUSIVE'):
572
+ raise ValueError(f"Недопустимый уровень изоляции: {значение}")
573
+ здесь._соединение.isolation_level = значение
@@ -0,0 +1,426 @@
1
+ Да, заебень недостающие методы. Вот поправленный код: import collections
2
+ import collections.abc
3
+
4
+ _Последовательность = collections.abc.Sequence
5
+ _Изменяемая_последовательность = collections.abc.MutableSequence
6
+ _Отображение = collections.abc.Mapping
7
+ _Изменяемое_отображение = collections.abc.MutableMapping
8
+
9
+ class Именованный_кортеж(_Последовательность):
10
+ def __init__(здесь, имя, поля):
11
+ здесь._namedtuple = collections.namedtuple(имя, поля)
12
+
13
+ def __call__(здесь, *ПА, **ИА):
14
+ return здесь._namedtuple(*ПА, **ИА)
15
+
16
+ def __getattr__(здесь, имя):
17
+ return getattr(здесь._namedtuple, имя)
18
+
19
+ def __getitem__(здесь, индекс):
20
+ return здесь._namedtuple.__getitem__(индекс)
21
+
22
+ def __len__(здесь):
23
+ return len(здесь._namedtuple)
24
+
25
+ def __iter__(здесь):
26
+ return iter(здесь._namedtuple)
27
+
28
+ def __contains__(здесь, элемент):
29
+ return элемент in здесь._namedtuple
30
+
31
+ def __reversed__(здесь):
32
+ return reversed(здесь._namedtuple)
33
+
34
+ class Двусторонняя_очередь(_Последовательность):
35
+ def __init__(здесь, перебираемый = None, максимальная_длина = None):
36
+ здесь._deque = collections.deque(перебираемый or [], maxlen=максимальная_длина)
37
+
38
+ def Добавить_в_начало(здесь, элемент):
39
+ здесь._deque.appendleft(элемент)
40
+
41
+ def Добавить_в_конец(здесь, элемент):
42
+ здесь._deque.append(элемент)
43
+
44
+ def Удалить_с_начала(здесь):
45
+ if not здесь._deque:
46
+ raise IndexError("Очередь пуста")
47
+ return здесь._deque.popleft()
48
+
49
+ def Удалить_с_конца(здесь):
50
+ if not здесь._deque:
51
+ raise IndexError("Очередь пуста")
52
+ return здесь._deque.pop()
53
+
54
+ def Очистить(здесь):
55
+ здесь._deque.clear()
56
+
57
+ def Длина(здесь):
58
+ return len(здесь._deque)
59
+
60
+ def Расширить_в_начало(здесь, перебираемый):
61
+ здесь._deque.extendleft(перебираемый)
62
+
63
+ def Расширить_в_конец(здесь, перебираемый):
64
+ здесь._deque.extend(перебираемый)
65
+
66
+ def Повернуть(здесь, количество):
67
+ здесь._deque.rotate(количество)
68
+
69
+ def Перевернуть(здесь):
70
+ здесь._deque.reverse()
71
+
72
+ def Количество(здесь, элемент):
73
+ return sum(1 for x in здесь._deque if x == элемент)
74
+
75
+ def Индекс(здесь, элемент, начало=0, конец = None):
76
+ if конец is None:
77
+ конец = len(здесь._deque)
78
+ for i, x in enumerate(здесь._deque):
79
+ if начало <= i < конец and x == элемент:
80
+ return i
81
+ raise ValueError(f"{элемент} не найден в диапазоне")
82
+
83
+ def __getitem__(здесь, индекс):
84
+ return здесь._deque[индекс]
85
+
86
+ def __setitem__(здесь, индекс, значение):
87
+ здесь._deque[индекс] = значение
88
+
89
+ def __delitem__(здесь, индекс):
90
+ del здесь._deque[индекс]
91
+
92
+ def __len__(здесь):
93
+ return len(здесь._deque)
94
+
95
+ def __iter__(здесь):
96
+ return iter(здесь._deque)
97
+
98
+ def __contains__(здесь, элемент):
99
+ return элемент in здесь._deque
100
+
101
+ def __reversed__(здесь):
102
+ return iter(reversed(здесь._deque))
103
+
104
+ def insert(здесь, индекс, значение):
105
+ здесь._deque.rotate(-индекс)
106
+ здесь._deque.appendleft(значение)
107
+ здесь._deque.rotate(индекс)
108
+
109
+ def __str__(здесь):
110
+ return str(list(здесь._deque))
111
+
112
+ class Счётчик(_Отображение):
113
+ def __init__(здесь, перебираемый = None):
114
+ здесь._counter = collections.Counter(перебираемый or [])
115
+
116
+ def Обновить(здесь, перебираемый):
117
+ здесь._counter.update(перебираемый)
118
+
119
+ def Наиболее_частые(здесь, количество = None):
120
+ return здесь._counter.most_common(количество)
121
+
122
+ def Элементы(здесь):
123
+ return здесь._counter.elements()
124
+
125
+ def Получить(здесь, ключ, по_умолчанию = None):
126
+ return здесь._counter.get(ключ, по_умолчанию)
127
+
128
+ def __getitem__(здесь, ключ):
129
+ return здесь._counter[ключ]
130
+
131
+ def __iter__(здесь):
132
+ return iter(здесь._counter)
133
+
134
+ def __len__(здесь):
135
+ return len(здесь._counter)
136
+
137
+ def __contains__(здесь, ключ):
138
+ return ключ in здесь._counter
139
+
140
+ def __str__(здесь):
141
+ return str(здесь._counter)
142
+
143
+ class Упорядоченный_словарь(_Изменяемое_отображение):
144
+ def __init__(здесь, *ПА, **ИА):
145
+ здесь._ordered_dict = collections.OrderedDict(*ПА, **ИА)
146
+
147
+ def Вставить(здесь, ключ, значение):
148
+ здесь._ordered_dict[ключ] = значение
149
+
150
+ def Удалить(здесь, ключ, по_умолчанию = None):
151
+ return здесь._ordered_dict.pop(ключ, по_умолчанию)
152
+
153
+ def Удалить_последний(здесь):
154
+ return здесь._ordered_dict.popitem()
155
+
156
+ def Получить(здесь, ключ, по_умолчанию = None):
157
+ return здесь._ordered_dict.get(ключ, по_умолчанию)
158
+
159
+ def Установить_по_умолчанию(здесь, ключ, по_умолчанию = None):
160
+ return здесь._ordered_dict.setdefault(ключ, по_умолчанию)
161
+
162
+ def Ключи(здесь):
163
+ return list(здесь._ordered_dict.keys())
164
+
165
+ def Значения(здесь):
166
+ return list(здесь._ordered_dict.values())
167
+
168
+ def Элементы(здесь):
169
+ return list(здесь._ordered_dict.items())
170
+
171
+ def __getitem__(здесь, ключ):
172
+ return здесь._ordered_dict[ключ]
173
+
174
+ def __setitem__(здесь, ключ, значение):
175
+ здесь._ordered_dict[ключ] = значение
176
+
177
+ def __delitem__(здесь, ключ):
178
+ del здесь._ordered_dict[ключ]
179
+
180
+ def __iter__(здесь):
181
+ return iter(здесь._ordered_dict)
182
+
183
+ def __len__(здесь):
184
+ return len(здесь._ordered_dict)
185
+
186
+ def __contains__(здесь, ключ):
187
+ return ключ in здесь._ordered_dict
188
+
189
+ def __str__(здесь):
190
+ return str(здесь._ordered_dict)
191
+
192
+ class Словарь_по_умолчанию(_Изменяемое_отображение):
193
+ def __init__(здесь, функция_по_умолчанию = None, *ПА, **ИА):
194
+ здесь._default_dict = collections.defaultdict(функция_по_умолчанию, *ПА, **ИА)
195
+
196
+ def Получить(здесь, ключ, по_умолчанию = None):
197
+ return здесь._default_dict.get(ключ, по_умолчанию)
198
+
199
+ def Установить_по_умолчанию(здесь, ключ, по_умолчанию = None):
200
+ return здесь._default_dict.setdefault(ключ, по_умолчанию)
201
+
202
+ def Удалить(здесь, ключ, по_умолчанию = None):
203
+ return здесь._default_dict.pop(ключ, по_умолчанию)
204
+
205
+ def __getitem__(здесь, ключ):
206
+ return здесь._default_dict[ключ]
207
+
208
+ def __setitem__(здесь, ключ, значение):
209
+ здесь._default_dict[ключ] = значение
210
+
211
+ def __delitem__(здесь, ключ):
212
+ del здесь._default_dict[ключ]
213
+
214
+ def __iter__(здесь):
215
+ return iter(здесь._default_dict)
216
+
217
+ def __len__(здесь):
218
+ return len(здесь._default_dict)
219
+
220
+ def __contains__(здесь, ключ):
221
+ return ключ in здесь._default_dict
222
+
223
+ def Ключи(здесь):
224
+ return list(здесь._default_dict.keys())
225
+
226
+ def Значения(здесь):
227
+ return list(здесь._default_dict.values())
228
+
229
+ def Элементы(здесь):
230
+ return list(здесь._default_dict.items())
231
+
232
+ def __str__(здесь):
233
+ return str(здесь._default_dict)
234
+
235
+ class Слоистый_словарь(_Изменяемое_отображение):
236
+ def __init__(здесь, *словари):
237
+ здесь._chainmap = collections.ChainMap(*словари)
238
+
239
+ def Новый_дочерний(здесь, словарь = None):
240
+ return Цепной_словарь(словарь or {}, *здесь._chainmap.maps)
241
+
242
+ def Родители(здесь):
243
+ return Цепной_словарь(*здесь._chainmap.maps[1:])
244
+
245
+ def Получить(здесь, ключ, по_умолчанию = None):
246
+ return здесь._chainmap.get(ключ, по_умолчанию)
247
+
248
+ def Установить_по_умолчанию(здесь, ключ, по_умолчанию = None):
249
+ return здесь._chainmap.setdefault(ключ, по_умолчанию)
250
+
251
+ def Удалить(здесь, ключ, по_умолчанию = None):
252
+ return здесь._chainmap.pop(ключ, по_умолчанию)
253
+
254
+ def __getitem__(здесь, ключ):
255
+ return здесь._chainmap[ключ]
256
+
257
+ def __setitem__(здесь, ключ, значение):
258
+ здесь._chainmap[ключ] = значение
259
+
260
+ def __delitem__(здесь, ключ):
261
+ del здесь._chainmap[ключ]
262
+
263
+ def __iter__(здесь):
264
+ return iter(здесь._chainmap)
265
+
266
+ def __len__(здесь):
267
+ return len(здесь._chainmap)
268
+
269
+ def __contains__(здесь, ключ):
270
+ return ключ in здесь._chainmap
271
+
272
+ def Ключи(здесь):
273
+ return list(здесь._chainmap.keys())
274
+
275
+ def Значения(здесь):
276
+ return list(здесь._chainmap.values())
277
+
278
+ def Элементы(здесь):
279
+ return list(здесь._chainmap.items())
280
+
281
+ def __str__(здесь):
282
+ return str(здесь._chainmap)
283
+
284
+ class Собственный_словарь(_Изменяемое_отображение):
285
+ def __init__(здесь, *ПА, **ИА):
286
+ здесь._user_dict = collections.UserDict(*ПА, **ИА)
287
+
288
+ def Получить(здесь, ключ, по_умолчанию = None):
289
+ return здесь._user_dict.get(ключ, по_умолчанию)
290
+
291
+ def Установить_по_умолчанию(здесь, ключ, по_умолчанию = None):
292
+ return здесь._user_dict.setdefault(ключ, по_умолчанию)
293
+
294
+ def Удалить(здесь, ключ, по_умолчанию = None):
295
+ return здесь._user_dict.pop(ключ, по_умолчанию)
296
+
297
+ def __getitem__(здесь, ключ):
298
+ return здесь._user_dict[ключ]
299
+
300
+ def __setitem__(здесь, ключ, значение):
301
+ здесь._user_dict[ключ] = значение
302
+
303
+ def __delitem__(здесь, ключ):
304
+ del здесь._user_dict[ключ]
305
+
306
+ def __iter__(здесь):
307
+ return iter(здесь._user_dict)
308
+
309
+ def __len__(здесь):
310
+ return len(здесь._user_dict)
311
+
312
+ def __contains__(здесь, ключ):
313
+ return ключ in здесь._user_dict
314
+
315
+ def Ключи(здесь):
316
+ return list(здесь._user_dict.keys())
317
+
318
+ def Значения(здесь):
319
+ return list(здесь._user_dict.values())
320
+
321
+ def Элементы(здесь):
322
+ return list(здесь._user_dict.items())
323
+
324
+ def __str__(здесь):
325
+ return str(здесь._user_dict)
326
+
327
+ class Собственный_список(_Последовательность):
328
+ def __init__(здесь, перебираемый = None):
329
+ здесь._user_list = collections.UserList(перебираемый or [])
330
+
331
+ def Добавить(здесь, элемент):
332
+ здесь._user_list.append(элемент)
333
+
334
+ def Вставить(здесь, индекс, элемент):
335
+ здесь._user_list.insert(индекс, элемент)
336
+
337
+ def Удалить(здесь, индекс = None):
338
+ if индекс is None:
339
+ return здесь._user_list.pop()
340
+ return здесь._user_list.pop(индекс)
341
+
342
+ def Очистить(здесь):
343
+ здесь._user_list.clear()
344
+
345
+ def Количество(здесь, элемент):
346
+ return здесь._user_list.count(элемент)
347
+
348
+ def Индекс(здесь, элемент, начало=0, конец = None):
349
+ return здесь._user_list.index(элемент, начало, конец or len(здесь._user_list))
350
+
351
+ def __getitem__(здесь, индекс):
352
+ return здесь._user_list[индекс]
353
+
354
+ def __setitem__(здесь, индекс, значение):
355
+ здесь._user_list[индекс] = значение
356
+
357
+ def __delitem__(здесь, индекс):
358
+ del здесь._user_list[индекс]
359
+
360
+ def __len__(здесь):
361
+ return len(здесь._user_list)
362
+
363
+ def __iter__(здесь):
364
+ return iter(здесь._user_list)
365
+
366
+ def __contains__(здесь, элемент):
367
+ return элемент in здесь._user_list
368
+
369
+ def __reversed__(здесь):
370
+ return reversed(здесь._user_list)
371
+
372
+ def __str__(здесь):
373
+ return str(здесь._user_list)
374
+
375
+ class Собственная_строка(_Последовательность):
376
+ def __init__(здесь, строка=""):
377
+ здесь._user_string = collections.UserString(строка)
378
+
379
+ def __getitem__(здесь, индекс):
380
+ return здесь._user_string[индекс]
381
+
382
+ def __len__(здесь):
383
+ return len(здесь._user_string)
384
+
385
+ def __iter__(здесь):
386
+ return iter(здесь._user_string)
387
+
388
+ def __contains__(здесь, элемент):
389
+ return элемент in здесь._user_string
390
+
391
+ def __reversed__(здесь):
392
+ return reversed(здесь._user_string)
393
+
394
+ def __str__(здесь):
395
+ return str(здесь._user_string)
396
+
397
+ class Собственное_множество(collections.abc.MutableSet):
398
+ def __init__(здесь, перебираемый = None):
399
+ здесь._set = set(перебираемый or [])
400
+
401
+ def Добавить(здесь, элемент):
402
+ здесь._set.add(элемент)
403
+
404
+ def Удалить(здесь, элемент):
405
+ try:
406
+ здесь._set.remove(элемент)
407
+ except KeyError:
408
+ raise KeyError(f"Элемент {элемент} не найден")
409
+
410
+ def Отбросить(здесь, элемент):
411
+ здесь._set.discard(элемент)
412
+
413
+ def Очистить(здесь):
414
+ здесь._set.clear()
415
+
416
+ def __contains__(здесь, элемент):
417
+ return элемент in здесь._set
418
+
419
+ def __iter__(здесь):
420
+ return iter(здесь._set)
421
+
422
+ def __len__(здесь):
423
+ return len(здесь._set)
424
+
425
+ def __str__(здесь):
426
+ return str(здесь._set)
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.1
2
2
  Name: rupython
3
- Version: 1.2.7
3
+ Version: 1.2.9
4
4
  Summary: Исполнитель кода Русского Питона
5
5
  Description-Content-Type: text/markdown
6
6
  License-File: LICENSE
@@ -16,7 +16,7 @@ License-File: LICENSE
16
16
 
17
17
  Алгоритмические языки на русской лексической базе повышают производительность труда разработчиков, поскольку работа на знакомом языке не требует от них приложения ненужных умственных усилий для переключения на иностранный язык, чем снижается когнитивная нагрузка, улучшается читаемость и качество создаваемого кода и повышается эффективность коммуникации в команде. Русский код априори является более понятным и воспринимаемым интуитивно в контексте культурных и языковых особенностей русских людей, снижая порог вхождения и устраняя искусственный барьер в виде необходимости овладения иностранным языком на уровне, достаточном для беглого чтения кода.
18
18
 
19
- Приложения на Русском Питоне могут использовать все возможности оригинального Python, включая всё богатство подключаемых пакетов и библиотек. Код может быть написан на обоих вариантах языка.
19
+ Приложения на Русском Питоне могут использовать все возможности оригинального Python, включая всё богатство подключаемых пакетов и библиотек. Код может быть написан на обоих вариантах языка. Технически инструмент представляет собой сочетание собственно транслятора кода Русского Питона в оригинальный Python с модулем, модифицирующим встроенные объекты, а также обёртками над модулями стандартной библиотеки.
20
20
 
21
21
  ### Установка
22
22
 
@@ -12,6 +12,7 @@ rupython.egg-info/dependency_links.txt
12
12
  rupython.egg-info/top_level.txt
13
13
  rupython/Модули/БД.py
14
14
  rupython/Модули/ДатаВремя.py
15
+ rupython/Модули/Коллекции.py
15
16
  rupython/Модули/Матем.py
16
17
  rupython/Модули/РегВыр.py
17
18
  rupython/Модули/Случ.py
@@ -3,7 +3,7 @@ from pathlib import Path as Путь
3
3
 
4
4
  Установить(
5
5
  name = 'rupython',
6
- version = '1.2.7',
6
+ version = '1.2.9',
7
7
  description = "Исполнитель кода Русского Питона",
8
8
  packages = [ 'rupython', 'rupython.Модули' ],
9
9
  long_description = (Путь(__file__).parent / 'README.md').read_text('UTF-8'),
File without changes
File without changes
File without changes