rupython 1.3.0__py3-none-any.whl → 1.3.2__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/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 +50 -32
- {rupython-1.3.0.dist-info → rupython-1.3.2.dist-info}/METADATA +3 -3
- {rupython-1.3.0.dist-info → rupython-1.3.2.dist-info}/RECORD +7 -7
- {rupython-1.3.0.dist-info → rupython-1.3.2.dist-info}/LICENSE +0 -0
- {rupython-1.3.0.dist-info → rupython-1.3.2.dist-info}/WHEEL +0 -0
- {rupython-1.3.0.dist-info → rupython-1.3.2.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
|
Исходник = Преобразователь.Преобразовать_код(Путь_к_файлу)
|
@@ -3,8 +3,8 @@ import runpy as Запуск_кода
|
|
3
3
|
import traceback as Разборщик_исключений
|
4
4
|
import os as ОС
|
5
5
|
import sys as Система
|
6
|
-
import importlib as Импортование
|
7
6
|
import re as РегВыр
|
7
|
+
import shutil as Операции_оболочки
|
8
8
|
from io import StringIO as Текстовый_ВВ
|
9
9
|
|
10
10
|
Служебные_слова = {
|
@@ -48,7 +48,9 @@ from io import StringIO as Текстовый_ВВ
|
|
48
48
|
'Используя': 'with',
|
49
49
|
'Удалить': 'del',
|
50
50
|
'Выбрать': 'match',
|
51
|
-
'При': 'case'
|
51
|
+
'При': 'case',
|
52
|
+
'Асинхр': 'async',
|
53
|
+
'Ожидать': 'await'
|
52
54
|
}
|
53
55
|
|
54
56
|
Встроенные_функции = {
|
@@ -68,10 +70,10 @@ from io import StringIO as Текстовый_ВВ
|
|
68
70
|
'Двоич': ( 'bin', None, False ),
|
69
71
|
'ДелОст': ( 'divmod', None, False ),
|
70
72
|
'Длина': ( 'len', None, False ), # Размер
|
71
|
-
'
|
73
|
+
'Код_символа': ( 'ord', None, False ), # Знак_в_код
|
72
74
|
'Идент': ( 'id', None, False ),
|
73
75
|
'Имеет_поле': ( 'hasattr', None, False ),
|
74
|
-
'
|
76
|
+
'Символ_по_коду': ( 'chr', None, False ), # Код_в_знак
|
75
77
|
'Компл': ( 'complex', { 'действ_часть': 'real', 'мнимая_часть': 'imag' }, True ),
|
76
78
|
'Кортеж': ( 'tuple', None, True ),
|
77
79
|
'Логич': ( 'bool', None, False ),
|
@@ -321,13 +323,13 @@ from io import StringIO as Текстовый_ВВ
|
|
321
323
|
|
322
324
|
def Прочитать_слова(чтение_строки, путь_к_файлу):
|
323
325
|
try:
|
324
|
-
for тип, название, _,_, строка in Разборщик_слов.generate_tokens(чтение_строки):
|
326
|
+
for тип, название, _, _, строка in Разборщик_слов.generate_tokens(чтение_строки):
|
325
327
|
if тип == 5: название = название.replace(' ' * 4, '\t')
|
326
328
|
отступов = 0; сч = 0
|
327
329
|
while (сч < len(строка) and строка[сч] == '\t'): отступов += 1; сч += 1
|
328
330
|
yield тип, название, отступов
|
329
331
|
except Exception as ошибка:
|
330
|
-
Вывести_текст_исключения(ошибка, 'при чтении кода', путь_к_
|
332
|
+
Вывести_текст_исключения(ошибка, 'при чтении кода', путь_к_файлу, True, False)
|
331
333
|
|
332
334
|
def Выполнить_основные_замены(слова, соответствия):
|
333
335
|
for номер, слово in enumerate(слова):
|
@@ -393,7 +395,7 @@ def Обработать_f_строки(слова, путь_к_файлу):
|
|
393
395
|
поз += 1
|
394
396
|
if уровень_скобок != 0:
|
395
397
|
искл = SyntaxError('Незакрытое выражение в f-строке')
|
396
|
-
Вывести_текст_исключения(искл, 'при разборе f-строки', путь_к_
|
398
|
+
Вывести_текст_исключения(искл, 'при разборе f-строки', путь_к_файлу, True, False)
|
397
399
|
выражение = содержимое[нач_поз:поз-1]
|
398
400
|
try:
|
399
401
|
токены_выражения = list(Разборщик_слов.generate_tokens(Текстовый_ВВ(выражение).readline))
|
@@ -405,7 +407,7 @@ def Обработать_f_строки(слова, путь_к_файлу):
|
|
405
407
|
выражение_текст = Разборщик_слов.untokenize((ток[0], ток[1]) for ток in токены_выражения if ток[0] not in (4, 5, 6)).strip()
|
406
408
|
новые_токены.append((3, '{' + выражение_текст + '}', отступов))
|
407
409
|
except Exception as ошибка:
|
408
|
-
Вывести_текст_исключения(ошибка, 'при разборе выражения в f-строке', путь_к_
|
410
|
+
Вывести_текст_исключения(ошибка, 'при разборе выражения в f-строке', путь_к_файлу, True, False)
|
409
411
|
else:
|
410
412
|
нач_поз = поз
|
411
413
|
while поз < len(содержимое) and содержимое[поз] not in ['{', '}']:
|
@@ -475,21 +477,32 @@ def Обработать_импорт(импорт, путь_к_текущему
|
|
475
477
|
путь = разделитель.join(путь) + \
|
476
478
|
(разделитель + источник.replace('.', разделитель) if len(источник) > 0 else '') + \
|
477
479
|
разделитель + название
|
478
|
-
|
480
|
+
|
481
|
+
def Преобразовать_скрипт(путь, доп_путь = None):
|
479
482
|
if путь not in Временные_файлы:
|
480
483
|
код = Преобразовать_код(путь + '.крп')
|
481
|
-
файл = open(путь + '.py', mode='w', encoding='utf-8')
|
482
|
-
if
|
484
|
+
файл = open((путь if not доп_путь else доп_путь) + '.py', mode='w', encoding='utf-8')
|
485
|
+
if not файл:
|
483
486
|
искл = FileNotFoundError('Невозможно открыть файл "' + файл + '".')
|
484
|
-
Вывести_текст_исключения(искл, 'при чтении кода', путь_к_
|
487
|
+
Вывести_текст_исключения(искл, 'при чтении кода', путь_к_файлу, True, False)
|
485
488
|
файл.write(код)
|
486
489
|
файл.close()
|
487
|
-
Временные_файлы.append(путь)
|
490
|
+
Временные_файлы.append(путь if not доп_путь else доп_путь)
|
491
|
+
|
492
|
+
if ОС.path.isfile(путь + '.крп') and not ОС.path.isfile(путь + '.py'):
|
493
|
+
Преобразовать_скрипт(путь)
|
494
|
+
elif ОС.path.exists(путь):
|
495
|
+
for скрипт_пакета in [('__Основа__', '__init__'), ('__Запуск__', '__main__')]:
|
496
|
+
if ОС.path.isfile(путь + разделитель + скрипт_пакета[0] + '.крп'):
|
497
|
+
Преобразовать_скрипт(
|
498
|
+
путь + разделитель + скрипт_пакета[0],
|
499
|
+
путь + разделитель + скрипт_пакета[1]
|
500
|
+
)
|
488
501
|
|
489
502
|
def Проверить_соответствие_слов(слова, путь_к_файлу):
|
490
503
|
def Вывести_исключение(инструкция):
|
491
504
|
искл = SyntaxError('Ошибка употребления инструкции "' + инструкция + '".')
|
492
|
-
Вывести_текст_исключения(искл, 'при разборе кода', путь_к_
|
505
|
+
Вывести_текст_исключения(искл, 'при разборе кода', путь_к_файлу, True, False)
|
493
506
|
|
494
507
|
for сл in ('Подключить', 'Если', 'Иначе'):
|
495
508
|
for поз in [i for i, x in enumerate(слова) if x[1] == сл]:
|
@@ -517,7 +530,7 @@ def Преобразовать_код(путь_к_файлу):
|
|
517
530
|
файл = open(путь_к_файлу, 'r', encoding='utf-8')
|
518
531
|
except:
|
519
532
|
искл = FileNotFoundError('Невозможно открыть файл "' + путь_к_файлу + '".')
|
520
|
-
Вывести_текст_исключения(искл, 'при чтении кода', путь_к_файлу, False)
|
533
|
+
Вывести_текст_исключения(искл, 'при чтении кода', путь_к_файлу, False, False)
|
521
534
|
|
522
535
|
слова = list(Прочитать_слова(файл.readline, путь_к_файлу))
|
523
536
|
if not Проверить_соответствие_слов(слова, путь_к_файлу): return
|
@@ -658,7 +671,7 @@ def Преобразовать_код(путь_к_файлу):
|
|
658
671
|
try:
|
659
672
|
исходник = Разборщик_слов.untokenize(map(lambda с: (с[0], с[1]), слова))
|
660
673
|
except Exception as ошибка:
|
661
|
-
Вывести_текст_исключения(ошибка, 'при чтении кода', путь_к_
|
674
|
+
Вывести_текст_исключения(ошибка, 'при чтении кода', путь_к_файлу, True, False)
|
662
675
|
|
663
676
|
if исходник:
|
664
677
|
исходник = 'import ' + __name__.split('.')[0] + '.__Заголовочный_код__\n\n' + исходник
|
@@ -720,12 +733,23 @@ def Посчитать_физические_строки(путь_к_файлу,
|
|
720
733
|
r"TypeError: cannot unpack non-iterable (\w+) object": r'Невозможно распаковать неитерируемый объект типа "\1".',
|
721
734
|
r"MemoryError": r'Недостаточно памяти для выполнения операции.',
|
722
735
|
r"OverflowError: (.+)": r'Переполнение: \1.',
|
723
|
-
r"no binding for nonlocal '(.+)' found": 'Не найдена привязка для нелокальной сущности "\1".',
|
736
|
+
r"no binding for nonlocal '(.+)' found": r'Не найдена привязка для нелокальной сущности "\1".',
|
724
737
|
r"AssertionError": r'Ошибка проверки: условие не выполнено.',
|
725
|
-
r"attempted relative import with no known parent package": r'Попытка относительного импорта без известного родительского пакета.'
|
738
|
+
r"attempted relative import with no known parent package": r'Попытка относительного импорта без известного родительского пакета.',
|
739
|
+
r"pop from empty list": r'Извлечение из пустого списка.',
|
740
|
+
r"No module named '(.+)'": r'Модуль под названием "\1" не найден.',
|
741
|
+
r"unindent does not match any outer indentation level": r'Отступ не соответствует никакому окружающему уровню.',
|
742
|
+
r"int too big to convert": r'Число слишком большое для преобразования.',
|
743
|
+
r"unexpected indent": r'Неожиданный отступ.'
|
726
744
|
}
|
727
745
|
|
728
|
-
def
|
746
|
+
def Очистить_файлы():
|
747
|
+
for файл in Временные_файлы:
|
748
|
+
ОС.remove(файл + '.py')
|
749
|
+
кэш = ОС.path.join(ОС.path.dirname(файл), '__pycache__')
|
750
|
+
if ОС.path.exists(кэш): Операции_оболочки.rmtree(кэш)
|
751
|
+
|
752
|
+
def Вывести_текст_исключения(исключение, заголовок, путь_к_файлу, с_заголовком = True, добавлен_импорт = False):
|
729
753
|
назв_исп_ф = путь_к_файлу.split('\\' if Система.platform.startswith('win32') else '/')[-1]
|
730
754
|
сч = 1
|
731
755
|
while True:
|
@@ -739,20 +763,14 @@ def Вывести_текст_исключения(исключение, заг
|
|
739
763
|
if искл.filename == назв_исп_ф: break
|
740
764
|
сч += 1
|
741
765
|
if сч != -1 and искл.filename == назв_исп_ф:
|
742
|
-
номер_строки = искл.lineno - 2
|
766
|
+
номер_строки = искл.lineno - (2 if добавлен_импорт else 0)
|
743
767
|
else:
|
744
|
-
try: номер_строки = исключение.lineno - 2
|
768
|
+
try: номер_строки = исключение.lineno - (2 if добавлен_импорт else 0)
|
745
769
|
except: номер_строки = 0
|
746
770
|
|
747
771
|
if номер_строки > 0:
|
748
772
|
номер_строки = Посчитать_физические_строки(путь_к_файлу, номер_строки)
|
749
773
|
|
750
|
-
выч_стр = 0
|
751
|
-
for ц in Циклы_со_счётчиком:
|
752
|
-
if номер_строки > ц[1] + 1: выч_стр += 2;
|
753
|
-
elif номер_строки > ц[0]: выч_стр += 1; break
|
754
|
-
else: break
|
755
|
-
номер_строки -= выч_стр
|
756
774
|
название_исключения = type(исключение).__name__
|
757
775
|
if название_исключения in Исключения.values():
|
758
776
|
название_исключения = next(к for к, з in Исключения.items() if з == название_исключения)
|
@@ -768,9 +786,9 @@ def Вывести_текст_исключения(исключение, заг
|
|
768
786
|
if РегВыр.match(шаблон, текст_исключения):
|
769
787
|
текст_исключения = РегВыр.sub(шаблон, перевод, текст_исключения)
|
770
788
|
break
|
771
|
-
print((' ' if с_заголовком else '')
|
789
|
+
print((' ' if с_заголовком else '') + str(текст_исключения))
|
772
790
|
|
773
|
-
|
791
|
+
Очистить_файлы()
|
774
792
|
input()
|
775
793
|
Система.exit()
|
776
794
|
|
@@ -778,9 +796,9 @@ def Запустить_код(название, исходник, путь_к_ф
|
|
778
796
|
код = None
|
779
797
|
try: код = compile(исходник, название, 'exec')
|
780
798
|
except Exception as исключение:
|
781
|
-
Вывести_текст_исключения(исключение, 'при разборе кода', путь_к_
|
799
|
+
Вывести_текст_исключения(исключение, 'при разборе кода', путь_к_файлу, True, True)
|
782
800
|
if код:
|
783
801
|
try: Запуск_кода._run_module_code(код, mod_name="__Главный__", script_name=путь_к_файлу)
|
784
802
|
except Exception as исключение:
|
785
|
-
Вывести_текст_исключения(исключение, 'при выполнении кода', путь_к_
|
786
|
-
|
803
|
+
Вывести_текст_исключения(исключение, 'при выполнении кода', путь_к_файлу, True, True)
|
804
|
+
Очистить_файлы()
|
@@ -1,6 +1,6 @@
|
|
1
1
|
Metadata-Version: 2.1
|
2
2
|
Name: rupython
|
3
|
-
Version: 1.3.
|
3
|
+
Version: 1.3.2
|
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,7 +1,7 @@
|
|
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=dxVD7cqs_zQAm6RMIv8hM5ImouaY7T7lCsnFSbEhUBM,50995
|
5
5
|
rupython/Модули/Асинхр.py,sha256=sPQUgbS_kXj-Gyn2YCjXNCUqAy8aUW2-P6gO5e7f6Cc,9925
|
6
6
|
rupython/Модули/БД.py,sha256=GQSKiv3fRF9Bsw4S7jXw4KR1Ibqvk8TwQbEe1JjvsGA,38392
|
7
7
|
rupython/Модули/ДатаВремя.py,sha256=Ec9YyY1jb-R9uyXrrDNfaTqBQVv98_GPn29OY8dUkj8,27523
|
@@ -14,8 +14,8 @@ rupython/Модули/Потоки.py,sha256=am6hWxcrCx4Vx_FFPMIIhSl_ShWSV5vjW5d
|
|
14
14
|
rupython/Модули/РегВыр.py,sha256=OWgYtgBDtHsEHUOAsGx7K0UGq92sumSqEyf-sVpICjw,6709
|
15
15
|
rupython/Модули/Случ.py,sha256=foIuQo2QZ5z0iyxp9fn4NaunSx96vYzC2pRjwaT2FD8,2723
|
16
16
|
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.
|
17
|
+
rupython-1.3.2.dist-info/LICENSE,sha256=qqVMvbdzR5e4XIV6qwYVgI5Ovki8wR0qZaKB2Oj9DXw,25656
|
18
|
+
rupython-1.3.2.dist-info/METADATA,sha256=UsXvGM99Hn_il6wjJVCi4DN-qTyKcC5pqlvh64s3CO4,30456
|
19
|
+
rupython-1.3.2.dist-info/WHEEL,sha256=P9jw-gEje8ByB7_hXoICnHtVCrEwMQh-630tKvQWehc,91
|
20
|
+
rupython-1.3.2.dist-info/top_level.txt,sha256=GtXaS8JTsBm5hpQxxtQlrxK6rExvSAK_Cp44FrY4210,9
|
21
|
+
rupython-1.3.2.dist-info/RECORD,,
|
File without changes
|
File without changes
|
File without changes
|