rupython 1.3.1__py3-none-any.whl → 1.3.3__py3-none-any.whl

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.
rupython/__main__.py CHANGED
@@ -9,6 +9,7 @@ import sys as Система
9
9
  def Перехватчик_прерывания_клавиатурой(тип_исключения, значение, предыдущие_шаги):
10
10
  if тип_исключения == KeyboardInterrupt: print('\nСработало прерывание клавиатурой.')
11
11
  else: Система.__excepthook__(тип_исключения, значение, предыдущие_шаги)
12
+ Преобразователь.Очистить_файлы()
12
13
  Система.excepthook = Перехватчик_прерывания_клавиатурой
13
14
 
14
15
  Исходник = Преобразователь.Преобразовать_код(Путь_к_файлу)
@@ -0,0 +1,99 @@
1
+ import asyncio
2
+
3
+ Задача_отменена = asyncio.CancelledError
4
+ Время_ожидания_истекло = asyncio.TimeoutError
5
+ Недопустимое_состояние = asyncio.InvalidStateError
6
+ Чтение_неполное = asyncio.IncompleteReadError
7
+ Буфер_переполнен = asyncio.LimitOverrunError
8
+ Ошибка_протокола_потока = asyncio.StreamReaderProtocol
9
+ Очередь_пуста = asyncio.QueueEmpty
10
+ Очередь_переполнена = asyncio.QueueFull
11
+
12
+ class Процедура:
13
+ def __init__(экземпляр, функция, *аргументы, **параметры):
14
+ экземпляр.функция = функция
15
+ экземпляр.аргументы = аргументы
16
+ экземпляр.параметры = параметры
17
+ экземпляр.задача = None
18
+
19
+ def Запустить(экземпляр):
20
+ экземпляр.задача = asyncio.create_task(
21
+ экземпляр.функция(*экземпляр.аргументы, **экземпляр.параметры)
22
+ )
23
+ return экземпляр.задача
24
+
25
+ async def Ждать(экземпляр):
26
+ if экземпляр.задача is None:
27
+ экземпляр.задача = экземпляр.запустить()
28
+ return await экземпляр.задача
29
+
30
+ class Задачи:
31
+ def __init__(экземпляр):
32
+ экземпляр.список = []
33
+
34
+ def Добавить(экземпляр, процедура):
35
+ задача = процедура.Запустить()
36
+ экземпляр.список.append(задача)
37
+
38
+ async def Ждать_все(экземпляр):
39
+ return await asyncio.gather(*экземпляр.список)
40
+
41
+ class Процесс:
42
+ def __init__(экземпляр, команда):
43
+ экземпляр.команда = команда
44
+ экземпляр.процесс = None
45
+
46
+ async def Запустить(экземпляр):
47
+ экземпляр.процесс = await asyncio.create_subprocess_shell(
48
+ экземпляр.команда,
49
+ stdout = asyncio.subprocess.PIPE,
50
+ stderr = asyncio.subprocess.PIPE
51
+ )
52
+ stdout, stderr = await экземпляр.процесс.communicate()
53
+ return {
54
+ "код": экземпляр.процесс.returncode,
55
+ "вывод": stdout.decode(),
56
+ "ошибка": stderr.decode()
57
+ }
58
+
59
+ class Поток:
60
+ def __init__(экземпляр, поток_чтения):
61
+ экземпляр.поток = поток_чтения
62
+
63
+ async def читать_всё(экземпляр):
64
+ строки = []
65
+ while True:
66
+ строка = await экземпляр.поток.readline()
67
+ if not строка:
68
+ break
69
+ строки.append(строка.decode())
70
+ return строки
71
+
72
+ class Блокование:
73
+ def __init__(экземпляр):
74
+ экземпляр.блокировка = asyncio.Lock()
75
+
76
+ async def Выполнить(экземпляр, функция, *аргументы, **параметры):
77
+ async with экземпляр.блокировка:
78
+ return await функция(*аргументы, **параметры)
79
+
80
+ async def Спать(секунд):
81
+ await asyncio.sleep(секунд)
82
+
83
+ def Запустить(процедура):
84
+ return asyncio.run(процедура)
85
+
86
+ def Создать_задачу(процедура):
87
+ return asyncio.create_task(процедура)
88
+
89
+ def Собрать(*процедуры):
90
+ return asyncio.gather(*процедуры)
91
+
92
+ def Ожидать(объект, таймаут = None):
93
+ return asyncio.wait_for(объект, timeout = таймаут)
94
+
95
+ def Все_задачи():
96
+ return asyncio.all_tasks()
97
+
98
+ def Текущая_задача():
99
+ return asyncio.current_task()
@@ -16,6 +16,7 @@ from io import StringIO as Текстовый_ВВ
16
16
  'не': 'not',
17
17
  'это': 'is',
18
18
  'Функция': 'def',
19
+ 'функция': 'def',
19
20
  'Класс': 'class',
20
21
  'Общее': 'global', # Глобальное
21
22
  'НеМестное': 'nonlocal', # Нелокальное
@@ -70,10 +71,10 @@ from io import StringIO as Текстовый_ВВ
70
71
  'Двоич': ( 'bin', None, False ),
71
72
  'ДелОст': ( 'divmod', None, False ),
72
73
  'Длина': ( 'len', None, False ), # Размер
73
- 'Знак_в_код': ( 'ord', None, False ),
74
+ 'Код_символа': ( 'ord', None, False ), # Знак_в_код
74
75
  'Идент': ( 'id', None, False ),
75
76
  'Имеет_поле': ( 'hasattr', None, False ),
76
- 'Код_в_знак': ( 'chr', None, False ),
77
+ 'Символ_по_коду': ( 'chr', None, False ), # Код_в_знак
77
78
  'Компл': ( 'complex', { 'действ_часть': 'real', 'мнимая_часть': 'imag' }, True ),
78
79
  'Кортеж': ( 'tuple', None, True ),
79
80
  'Логич': ( 'bool', None, False ),
@@ -323,13 +324,13 @@ from io import StringIO as Текстовый_ВВ
323
324
 
324
325
  def Прочитать_слова(чтение_строки, путь_к_файлу):
325
326
  try:
326
- for тип, название, _,_, строка in Разборщик_слов.generate_tokens(чтение_строки):
327
+ for тип, название, _, _, строка in Разборщик_слов.generate_tokens(чтение_строки):
327
328
  if тип == 5: название = название.replace(' ' * 4, '\t')
328
329
  отступов = 0; сч = 0
329
330
  while (сч < len(строка) and строка[сч] == '\t'): отступов += 1; сч += 1
330
331
  yield тип, название, отступов
331
332
  except Exception as ошибка:
332
- Вывести_текст_исключения(ошибка, 'при чтении кода', путь_к_файлу)
333
+ Вывести_текст_исключения(ошибка, 'при чтении кода', путь_к_файлу, True, False)
333
334
 
334
335
  def Выполнить_основные_замены(слова, соответствия):
335
336
  for номер, слово in enumerate(слова):
@@ -395,7 +396,7 @@ def Обработать_f_строки(слова, путь_к_файлу):
395
396
  поз += 1
396
397
  if уровень_скобок != 0:
397
398
  искл = SyntaxError('Незакрытое выражение в f-строке')
398
- Вывести_текст_исключения(искл, 'при разборе f-строки', путь_к_файлу)
399
+ Вывести_текст_исключения(искл, 'при разборе f-строки', путь_к_файлу, True, False)
399
400
  выражение = содержимое[нач_поз:поз-1]
400
401
  try:
401
402
  токены_выражения = list(Разборщик_слов.generate_tokens(Текстовый_ВВ(выражение).readline))
@@ -407,7 +408,7 @@ def Обработать_f_строки(слова, путь_к_файлу):
407
408
  выражение_текст = Разборщик_слов.untokenize((ток[0], ток[1]) for ток in токены_выражения if ток[0] not in (4, 5, 6)).strip()
408
409
  новые_токены.append((3, '{' + выражение_текст + '}', отступов))
409
410
  except Exception as ошибка:
410
- Вывести_текст_исключения(ошибка, 'при разборе выражения в f-строке', путь_к_файлу)
411
+ Вывести_текст_исключения(ошибка, 'при разборе выражения в f-строке', путь_к_файлу, True, False)
411
412
  else:
412
413
  нач_поз = поз
413
414
  while поз < len(содержимое) and содержимое[поз] not in ['{', '}']:
@@ -484,7 +485,7 @@ def Обработать_импорт(импорт, путь_к_текущему
484
485
  файл = open((путь if not доп_путь else доп_путь) + '.py', mode='w', encoding='utf-8')
485
486
  if not файл:
486
487
  искл = FileNotFoundError('Невозможно открыть файл "' + файл + '".')
487
- Вывести_текст_исключения(искл, 'при чтении кода', путь_к_файлу)
488
+ Вывести_текст_исключения(искл, 'при чтении кода', путь_к_файлу, True, False)
488
489
  файл.write(код)
489
490
  файл.close()
490
491
  Временные_файлы.append(путь if not доп_путь else доп_путь)
@@ -502,7 +503,7 @@ def Обработать_импорт(импорт, путь_к_текущему
502
503
  def Проверить_соответствие_слов(слова, путь_к_файлу):
503
504
  def Вывести_исключение(инструкция):
504
505
  искл = SyntaxError('Ошибка употребления инструкции "' + инструкция + '".')
505
- Вывести_текст_исключения(искл, 'при разборе кода', путь_к_файлу)
506
+ Вывести_текст_исключения(искл, 'при разборе кода', путь_к_файлу, True, False)
506
507
 
507
508
  for сл in ('Подключить', 'Если', 'Иначе'):
508
509
  for поз in [i for i, x in enumerate(слова) if x[1] == сл]:
@@ -521,6 +522,10 @@ def Проверить_соответствие_слов(слова, путь_к
521
522
  if поз != len(слова) - 1 and слова[поз + 1][0] not in (4, 61, 65):
522
523
  Вывести_исключение('Возврат'); return False
523
524
 
525
+ for поз in [i for i, x in enumerate(слова) if x[1] == 'функция']:
526
+ if поз == 0 or слова[поз - 1][1] != 'Асинхр':
527
+ Вывести_исключение('функция'); return False
528
+
524
529
  return True
525
530
 
526
531
  Циклы_со_счётчиком = []
@@ -530,7 +535,7 @@ def Преобразовать_код(путь_к_файлу):
530
535
  файл = open(путь_к_файлу, 'r', encoding='utf-8')
531
536
  except:
532
537
  искл = FileNotFoundError('Невозможно открыть файл "' + путь_к_файлу + '".')
533
- Вывести_текст_исключения(искл, 'при чтении кода', путь_к_файлу, False)
538
+ Вывести_текст_исключения(искл, 'при чтении кода', путь_к_файлу, False, False)
534
539
 
535
540
  слова = list(Прочитать_слова(файл.readline, путь_к_файлу))
536
541
  if not Проверить_соответствие_слов(слова, путь_к_файлу): return
@@ -671,7 +676,7 @@ def Преобразовать_код(путь_к_файлу):
671
676
  try:
672
677
  исходник = Разборщик_слов.untokenize(map(lambda с: (с[0], с[1]), слова))
673
678
  except Exception as ошибка:
674
- Вывести_текст_исключения(ошибка, 'при чтении кода', путь_к_файлу)
679
+ Вывести_текст_исключения(ошибка, 'при чтении кода', путь_к_файлу, True, False)
675
680
 
676
681
  if исходник:
677
682
  исходник = 'import ' + __name__.split('.')[0] + '.__Заголовочный_код__\n\n' + исходник
@@ -737,7 +742,14 @@ def Посчитать_физические_строки(путь_к_файлу,
737
742
  r"AssertionError": r'Ошибка проверки: условие не выполнено.',
738
743
  r"attempted relative import with no known parent package": r'Попытка относительного импорта без известного родительского пакета.',
739
744
  r"pop from empty list": r'Извлечение из пустого списка.',
740
- r"No module named '(.+)'": r'Модуль под названием "\1" не найден.'
745
+ r"No module named '(.+)'": r'Модуль под названием "\1" не найден.',
746
+ r"unindent does not match any outer indentation level": r'Отступ не соответствует никакому окружающему уровню.',
747
+ r"int too big to convert": r'Число слишком большое для преобразования.',
748
+ r"unexpected indent": r'Неожиданный отступ.',
749
+ r"cannot import name '(.+)' from '(.+)' (unknown location)": r'Невозможно импортовать название "\1" из "\2" (неизвестное расположение).',
750
+ r"(.+) missing (.+) required positional arguments: (.+), and (.+)": r'Для функции "\1" требуется позиционных аргументов: \2 (\3 и \4).',
751
+ r"module '(.+)' has no attribute '(.+)'": r'Модуль "\1" не имеет атрибута "\1".',
752
+ r"string argument without an encoding": r'Строковый аргумент без кодования.'
741
753
  }
742
754
 
743
755
  def Очистить_файлы():
@@ -746,7 +758,7 @@ def Очистить_файлы():
746
758
  кэш = ОС.path.join(ОС.path.dirname(файл), '__pycache__')
747
759
  if ОС.path.exists(кэш): Операции_оболочки.rmtree(кэш)
748
760
 
749
- def Вывести_текст_исключения(исключение, заголовок, путь_к_файлу, с_заголовком = True):
761
+ def Вывести_текст_исключения(исключение, заголовок, путь_к_файлу, с_заголовком = True, добавлен_импорт = False):
750
762
  назв_исп_ф = путь_к_файлу.split('\\' if Система.platform.startswith('win32') else '/')[-1]
751
763
  сч = 1
752
764
  while True:
@@ -760,9 +772,9 @@ def Вывести_текст_исключения(исключение, заг
760
772
  if искл.filename == назв_исп_ф: break
761
773
  сч += 1
762
774
  if сч != -1 and искл.filename == назв_исп_ф:
763
- номер_строки = искл.lineno - 2
775
+ номер_строки = искл.lineno - (2 if добавлен_импорт else 0)
764
776
  else:
765
- try: номер_строки = исключение.lineno - 2
777
+ try: номер_строки = исключение.lineno - (2 if добавлен_импорт else 0)
766
778
  except: номер_строки = 0
767
779
 
768
780
  if номер_строки > 0:
@@ -793,9 +805,9 @@ def Запустить_код(название, исходник, путь_к_ф
793
805
  код = None
794
806
  try: код = compile(исходник, название, 'exec')
795
807
  except Exception as исключение:
796
- Вывести_текст_исключения(исключение, 'при разборе кода', путь_к_файлу)
808
+ Вывести_текст_исключения(исключение, 'при разборе кода', путь_к_файлу, True, True)
797
809
  if код:
798
810
  try: Запуск_кода._run_module_code(код, mod_name="__Главный__", script_name=путь_к_файлу)
799
811
  except Exception as исключение:
800
- Вывести_текст_исключения(исключение, 'при выполнении кода', путь_к_файлу)
812
+ Вывести_текст_исключения(исключение, 'при выполнении кода', путь_к_файлу, True, True)
801
813
  Очистить_файлы()
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.1
2
2
  Name: rupython
3
- Version: 1.3.1
3
+ Version: 1.3.3
4
4
  Summary: Исполнитель кода Русского Питона
5
5
  Author: Сообщество русских программистов
6
6
  License: ОДРН
@@ -295,7 +295,7 @@ x = 0
295
295
  ###### `Вызываемое(объект)`
296
296
  Проверяет, можно ли объект вызвать как функцию.
297
297
 
298
- ###### `Код_в_знак(i)`
298
+ ###### `Символ_по_коду(i)`
299
299
  Возвращает многобайтовый символ по его числовому коду.
300
300
 
301
301
  ###### `@Метод_класса`
@@ -409,7 +409,7 @@ x = 0
409
409
  ###### `Открыть(название, режим = 'r', буферизация = -1, кодование = Пусто, при_ошибках = Пусто, новая_строка = Пусто, закрыть_описатель = Да, открыватель = Пусто)`
410
410
  Открывает файл и возвращает файловый объект.
411
411
 
412
- ###### `Знак_в_код(c)`
412
+ ###### `Код_символа(c)`
413
413
  Возвращает многобайтовый код символа `c`.
414
414
 
415
415
  ###### `Степень(основание, показатель, модуль = Пусто)`
@@ -1,8 +1,9 @@
1
- rupython/__main__.py,sha256=wfmjyJhg6iQN1_9Hl6tIu6mKHO95xP2ibVcDdIIEXjE,1256
1
+ rupython/__main__.py,sha256=sb4hTmi5_MtnNDEpm43DAgklVPWT4ddm4yQtattUdeE,1322
2
2
  rupython/__Заголовочный_код__.py,sha256=yTxMJ93pxJeg_h-BnrTMoAqSB_a0tliYX6gkXtTyWx8,13594
3
3
  rupython/__Общие_функции__.py,sha256=MH9QLcXqeFmpOS5_N8P5wA5eCYutlHRc7YUatn3CUIk,1255
4
- rupython/Преобразователь.py,sha256=2d3ty3VSnU2cT7oG8Kyta2ejies_3vJPJSuGNf0jBBA,50363
4
+ rupython/Преобразователь.py,sha256=04puHUj0KkH9GpLrA3KCv0tNq6h4ZPJQ0PR-LJgZ3Po,51866
5
5
  rupython/Модули/Асинхр.py,sha256=sPQUgbS_kXj-Gyn2YCjXNCUqAy8aUW2-P6gO5e7f6Cc,9925
6
+ rupython/Модули/Асинхронность.py,sha256=-iBmQmykdePgP2pW8UQtLQjRND3mVnafdBYccDqc0WQ,3786
6
7
  rupython/Модули/БД.py,sha256=GQSKiv3fRF9Bsw4S7jXw4KR1Ibqvk8TwQbEe1JjvsGA,38392
7
8
  rupython/Модули/ДатаВремя.py,sha256=Ec9YyY1jb-R9uyXrrDNfaTqBQVv98_GPn29OY8dUkj8,27523
8
9
  rupython/Модули/Запросы.py,sha256=BPFWyPDLA6Qjmzb5KwOhuGZ5qjeAE0fudz5aJ8lRa6o,7562
@@ -14,8 +15,8 @@ rupython/Модули/Потоки.py,sha256=am6hWxcrCx4Vx_FFPMIIhSl_ShWSV5vjW5d
14
15
  rupython/Модули/РегВыр.py,sha256=OWgYtgBDtHsEHUOAsGx7K0UGq92sumSqEyf-sVpICjw,6709
15
16
  rupython/Модули/Случ.py,sha256=foIuQo2QZ5z0iyxp9fn4NaunSx96vYzC2pRjwaT2FD8,2723
16
17
  rupython/Модули/Файлы.py,sha256=AekdYf2jmPhRW_9BngbQDzgTfsMr4zPpKzuwp6fRfzQ,6895
17
- rupython-1.3.1.dist-info/LICENSE,sha256=qqVMvbdzR5e4XIV6qwYVgI5Ovki8wR0qZaKB2Oj9DXw,25656
18
- rupython-1.3.1.dist-info/METADATA,sha256=SrKBt4MpO6sAbbE0pqWB7if728Q4r5UILawWh4lu3tM,30445
19
- rupython-1.3.1.dist-info/WHEEL,sha256=P9jw-gEje8ByB7_hXoICnHtVCrEwMQh-630tKvQWehc,91
20
- rupython-1.3.1.dist-info/top_level.txt,sha256=GtXaS8JTsBm5hpQxxtQlrxK6rExvSAK_Cp44FrY4210,9
21
- rupython-1.3.1.dist-info/RECORD,,
18
+ rupython-1.3.3.dist-info/LICENSE,sha256=qqVMvbdzR5e4XIV6qwYVgI5Ovki8wR0qZaKB2Oj9DXw,25656
19
+ rupython-1.3.3.dist-info/METADATA,sha256=j9TdftdbkoujZD4jVqh23uwUjdIT3SMAYId9Ve41O_s,30456
20
+ rupython-1.3.3.dist-info/WHEEL,sha256=P9jw-gEje8ByB7_hXoICnHtVCrEwMQh-630tKvQWehc,91
21
+ rupython-1.3.3.dist-info/top_level.txt,sha256=GtXaS8JTsBm5hpQxxtQlrxK6rExvSAK_Cp44FrY4210,9
22
+ rupython-1.3.3.dist-info/RECORD,,