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 +1 -0
- rupython//342/225/250/320/254/342/225/250/342/225/233/342/225/250/342/224/244/342/225/244/320/223/342/225/250/342/225/227/342/225/250/342/225/225//342/225/250/320/240/342/225/244/320/221/342/225/250/342/225/225/342/225/250/342/225/234/342/225/244/320/225/342/225/244/320/220/342/225/250/342/225/233/342/225/250/342/225/234/342/225/250/342/225/234/342/225/250/342/225/233/342/225/244/320/221/342/225/244/320/222/342/225/244/320/234.py +99 -0
- rupython//342/225/250/320/257/342/225/244/320/220/342/225/250/342/225/241/342/225/250/342/225/233/342/225/250/342/226/222/342/225/244/320/220/342/225/250/342/226/221/342/225/250/342/225/226/342/225/250/342/225/233/342/225/250/342/226/223/342/225/250/342/226/221/342/225/244/320/222/342/225/250/342/225/241/342/225/250/342/225/227/342/225/244/320/234.py +28 -16
- {rupython-1.3.1.dist-info → rupython-1.3.3.dist-info}/METADATA +3 -3
- {rupython-1.3.1.dist-info → rupython-1.3.3.dist-info}/RECORD +8 -7
- {rupython-1.3.1.dist-info → rupython-1.3.3.dist-info}/LICENSE +0 -0
- {rupython-1.3.1.dist-info → rupython-1.3.3.dist-info}/WHEEL +0 -0
- {rupython-1.3.1.dist-info → rupython-1.3.3.dist-info}/top_level.txt +0 -0
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
|
-
'
|
74
|
+
'Код_символа': ( 'ord', None, False ), # Знак_в_код
|
74
75
|
'Идент': ( 'id', None, False ),
|
75
76
|
'Имеет_поле': ( 'hasattr', None, False ),
|
76
|
-
'
|
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.
|
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
|
-
######
|
298
|
+
###### `Символ_по_коду(i)`
|
299
299
|
Возвращает многобайтовый символ по его числовому коду.
|
300
300
|
|
301
301
|
###### `@Метод_класса`
|
@@ -409,7 +409,7 @@ x = 0
|
|
409
409
|
###### `Открыть(название, режим = 'r', буферизация = -1, кодование = Пусто, при_ошибках = Пусто, новая_строка = Пусто, закрыть_описатель = Да, открыватель = Пусто)`
|
410
410
|
Открывает файл и возвращает файловый объект.
|
411
411
|
|
412
|
-
######
|
412
|
+
###### `Код_символа(c)`
|
413
413
|
Возвращает многобайтовый код символа `c`.
|
414
414
|
|
415
415
|
###### `Степень(основание, показатель, модуль = Пусто)`
|
@@ -1,8 +1,9 @@
|
|
1
|
-
rupython/__main__.py,sha256=
|
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=
|
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.
|
18
|
-
rupython-1.3.
|
19
|
-
rupython-1.3.
|
20
|
-
rupython-1.3.
|
21
|
-
rupython-1.3.
|
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,,
|
File without changes
|
File without changes
|
File without changes
|