rupython 1.2.1__py3-none-any.whl → 1.2.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 +5 -2
- rupython/__/342/225/250/320/256/342/225/250/342/226/222/342/225/244/320/231/342/225/250/342/225/225/342/225/250/342/225/241_/342/225/244/320/224/342/225/244/320/223/342/225/250/342/225/234/342/225/250/342/225/221/342/225/244/320/226/342/225/250/342/225/225/342/225/250/342/225/225__.py +21 -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/241/342/225/250/320/244.py +1 -1
- 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/244/342/225/250/342/226/221/342/225/244/320/222/342/225/250/342/226/221/342/225/250/320/242/342/225/244/320/220/342/225/250/342/225/241/342/225/250/342/225/235/342/225/244/320/237.py +478 -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/260/342/225/250/342/225/241/342/225/250/342/224/202/342/225/250/320/242/342/225/244/320/233/342/225/244/320/220.py +11 -10
- 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/261/342/225/250/342/225/227/342/225/244/320/223/342/225/244/320/227.py +4 -3
- 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 +57 -1
- {rupython-1.2.1.dist-info → rupython-1.2.3.dist-info}/METADATA +1 -1
- rupython-1.2.3.dist-info/RECORD +14 -0
- rupython-1.2.1.dist-info/RECORD +0 -12
- {rupython-1.2.1.dist-info → rupython-1.2.3.dist-info}/LICENSE +0 -0
- {rupython-1.2.1.dist-info → rupython-1.2.3.dist-info}/WHEEL +0 -0
- {rupython-1.2.1.dist-info → rupython-1.2.3.dist-info}/top_level.txt +0 -0
rupython/__main__.py
CHANGED
@@ -1,4 +1,5 @@
|
|
1
1
|
from . import Преобразователь
|
2
|
+
from . import __Общие_функции__
|
2
3
|
import os as ОС
|
3
4
|
import sys as Система
|
4
5
|
|
@@ -7,10 +8,12 @@ import sys as Система
|
|
7
8
|
|
8
9
|
def Перехватчик_прерывания_клавиатурой(тип_исключения, значение, предыдущие_шаги):
|
9
10
|
if тип_исключения == KeyboardInterrupt: print('\nСработало прерывание клавиатурой.')
|
10
|
-
else: Система.__excepthook__(
|
11
|
+
else: Система.__excepthook__(тип_исключения, значение, предыдущие_шаги)
|
11
12
|
Система.excepthook = Перехватчик_прерывания_клавиатурой
|
12
13
|
|
13
14
|
Исходник = Преобразователь.Преобразовать_код(Путь_к_файлу)
|
14
15
|
if Исходник: Преобразователь.Запустить_код(Название_файла, Исходник, Путь_к_файлу)
|
15
16
|
|
16
|
-
|
17
|
+
__Общие_функции__.Ожидать_нажатие_клавиши(
|
18
|
+
'=== Исполнение кода завершено. Нажмите любую клавишу для выхода. ==='
|
19
|
+
)
|
@@ -0,0 +1,21 @@
|
|
1
|
+
import os as ОС
|
2
|
+
|
3
|
+
def Заменить_ключи_в_словаре(словарь, замены):
|
4
|
+
новый = {}
|
5
|
+
for н, з in словарь.items():
|
6
|
+
новый.setdefault(замены[н] if н in замены.keys() else н, з)
|
7
|
+
return новый
|
8
|
+
|
9
|
+
def Ожидать_нажатие_клавиши(сообщение):
|
10
|
+
if ОС.name == 'nt':
|
11
|
+
import msvcrt
|
12
|
+
print('\n' + сообщение)
|
13
|
+
msvcrt.getch()
|
14
|
+
else:
|
15
|
+
import tty
|
16
|
+
import termios
|
17
|
+
print('\n' + сообщение)
|
18
|
+
fd = Система.stdin.fileno()
|
19
|
+
старые_настройки = termios.tcgetattr(fd)
|
20
|
+
try: tty.setraw(fd); Система.stdin.read(1)
|
21
|
+
finally: termios.tcsetattr(fd, termios.TCSADRAIN, старые_настройки)
|
@@ -252,7 +252,7 @@ def Перевести_токены(токены):
|
|
252
252
|
for ключ, значение in Словарь_перевода.items():
|
253
253
|
if '___' in ключ:
|
254
254
|
шаблон = '^' + ключ.replace('___', r'(\S+)') + '$'
|
255
|
-
совпадение =
|
255
|
+
совпадение = РегВыр.match(шаблон, фраза)
|
256
256
|
if совпадение:
|
257
257
|
переменная = совпадение.group(1).upper()
|
258
258
|
if переменная in Словарь_перевода:
|
@@ -0,0 +1,478 @@
|
|
1
|
+
import datetime
|
2
|
+
from rupython import __Общие_функции__
|
3
|
+
|
4
|
+
Часовой_пояс = datetime.timezone
|
5
|
+
Временная_метка = datetime.datetime
|
6
|
+
|
7
|
+
Формат_даты = '%Д.%М.%Г'
|
8
|
+
Формат_времени = '%ч:%м:%с'
|
9
|
+
Формат_даты_и_времени = '%Д.%М.%Г %ч:%м:%с'
|
10
|
+
|
11
|
+
Словарь_спецификаторов = {
|
12
|
+
'%Г': '%Y', # год (4 цифры, например 1945)
|
13
|
+
'%М': '%m', # месяц (2 цифры, 01–12)
|
14
|
+
'%Д': '%d', # день (2 цифры, 01–31)
|
15
|
+
'%ч': '%H', # часы (2 цифры, 00–23)
|
16
|
+
'%м': '%M', # минуты (2 цифры, 00–59)
|
17
|
+
'%с': '%S', # секунды (2 цифры, 00–59)
|
18
|
+
'%д': '%f' # дробная часть секунды (в микросекундах) (6 цифр, 000000–999999)
|
19
|
+
}
|
20
|
+
|
21
|
+
Словарь_параметров = {
|
22
|
+
'год': 'year', 'месяц': 'month', 'день': 'day',
|
23
|
+
'часов': 'hour', 'минут': 'minute', 'секунд': 'second',
|
24
|
+
'микросекунд': 'microsecond', 'часовой_пояс': 'tzinfo',
|
25
|
+
'добавка_летнего_времени': 'fold'
|
26
|
+
}
|
27
|
+
|
28
|
+
Словарь_параметров_интервала = {
|
29
|
+
'дней': 'days', 'секунд': 'seconds',
|
30
|
+
'микросекунд': 'microseconds', 'миллисекунд': 'milliseconds',
|
31
|
+
'минут': 'minutes', 'часов': 'hours', 'недель': 'weeks'
|
32
|
+
}
|
33
|
+
|
34
|
+
def Перевести_формат(формат):
|
35
|
+
for русский, питоновский in Словарь_спецификаторов.items():
|
36
|
+
формат = формат.replace(русский, питоновский)
|
37
|
+
return формат
|
38
|
+
|
39
|
+
class Дата_и_время:
|
40
|
+
def __init__(здесь, *ПА, **ИА):
|
41
|
+
if len(ПА) > 0 and type(ПА[0]) == datetime.datetime: здесь._дата_время = ПА[0]
|
42
|
+
else:
|
43
|
+
ИА = __Общие_функции__.Заменить_ключи_в_словаре(
|
44
|
+
ИА, Словарь_параметров
|
45
|
+
)
|
46
|
+
здесь._дата_время = datetime.datetime(*ПА, **ИА)
|
47
|
+
|
48
|
+
@staticmethod
|
49
|
+
def Сейчас(часовой_пояс=None):
|
50
|
+
return Дата_и_время(datetime.datetime.now(часовой_пояс))
|
51
|
+
|
52
|
+
@staticmethod
|
53
|
+
def До_сейчас():
|
54
|
+
return Дата_и_время(datetime.datetime.utcnow())
|
55
|
+
|
56
|
+
@staticmethod
|
57
|
+
def Из_метки_времени(метка_времени, часовой_пояс=None):
|
58
|
+
return Дата_и_время(datetime.datetime.fromtimestamp(метка_времени, часовой_пояс))
|
59
|
+
|
60
|
+
@staticmethod
|
61
|
+
def Из_формата_ISO(строка):
|
62
|
+
return Дата_и_время(datetime.datetime.fromisoformat(строка))
|
63
|
+
|
64
|
+
@staticmethod
|
65
|
+
def Разобрать(строка, формат):
|
66
|
+
формат = Перевести_формат(формат)
|
67
|
+
return Дата_и_время(datetime.datetime.strptime(строка, формат))
|
68
|
+
|
69
|
+
def Формат(здесь, формат):
|
70
|
+
формат = Перевести_формат(формат)
|
71
|
+
return здесь._дата_время.strftime(формат)
|
72
|
+
|
73
|
+
def В_строку(здесь):
|
74
|
+
return здесь._дата_время.isoformat()
|
75
|
+
|
76
|
+
def В_метку_времени(здесь):
|
77
|
+
return здесь._дата_время.timestamp()
|
78
|
+
|
79
|
+
def День_недели(здесь):
|
80
|
+
return здесь._дата_время.weekday()
|
81
|
+
|
82
|
+
def Номер_дня_недели(здесь):
|
83
|
+
return здесь._дата_время.isoweekday()
|
84
|
+
|
85
|
+
def Добавить(здесь, интервал):
|
86
|
+
return Дата_и_время(здесь._дата_время + интервал._интервал)
|
87
|
+
|
88
|
+
def Вычесть(здесь, интервал):
|
89
|
+
return Дата_и_время(здесь._дата_время - интервал._интервал)
|
90
|
+
|
91
|
+
def __add__(здесь, другой):
|
92
|
+
if isinstance(другой, Интервал):
|
93
|
+
return здесь.Добавить(другой)
|
94
|
+
return NotImplemented
|
95
|
+
|
96
|
+
def __radd__(здесь, другой):
|
97
|
+
if isinstance(другой, Интервал):
|
98
|
+
return здесь.Добавить(другой)
|
99
|
+
return NotImplemented
|
100
|
+
|
101
|
+
def __sub__(здесь, другой):
|
102
|
+
if isinstance(другой, Интервал):
|
103
|
+
return здесь.Вычесть(другой)
|
104
|
+
return NotImplemented
|
105
|
+
|
106
|
+
def __eq__(здесь, другой):
|
107
|
+
if isinstance(другой, Дата_и_время):
|
108
|
+
return здесь._дата_время == другой._дата_время
|
109
|
+
return NotImplemented
|
110
|
+
|
111
|
+
def __lt__(здесь, другой):
|
112
|
+
if isinstance(другой, Дата_и_время):
|
113
|
+
return здесь._дата_время < другой._дата_время
|
114
|
+
return NotImplemented
|
115
|
+
|
116
|
+
def __le__(здесь, другой):
|
117
|
+
if isinstance(другой, Дата_и_время):
|
118
|
+
return здесь._дата_время <= другой._дата_время
|
119
|
+
return NotImplemented
|
120
|
+
|
121
|
+
def __gt__(здесь, другой):
|
122
|
+
if isinstance(другой, Дата_и_время):
|
123
|
+
return здесь._дата_время > другой._дата_время
|
124
|
+
return NotImplemented
|
125
|
+
|
126
|
+
def __ge__(здесь, другой):
|
127
|
+
if isinstance(другой, Дата_и_время):
|
128
|
+
return здесь._дата_время >= другой._дата_время
|
129
|
+
return NotImplemented
|
130
|
+
|
131
|
+
@property
|
132
|
+
def Год(здесь):
|
133
|
+
return здесь._дата_время.year
|
134
|
+
|
135
|
+
@property
|
136
|
+
def Месяц(здесь):
|
137
|
+
return здесь._дата_время.month
|
138
|
+
|
139
|
+
@property
|
140
|
+
def День(здесь):
|
141
|
+
return здесь._дата_время.day
|
142
|
+
|
143
|
+
@property
|
144
|
+
def Часов(здесь):
|
145
|
+
return здесь._дата_время.hour
|
146
|
+
|
147
|
+
@property
|
148
|
+
def Минут(здесь):
|
149
|
+
return здесь._дата_время.minute
|
150
|
+
|
151
|
+
@property
|
152
|
+
def Секунд(здесь):
|
153
|
+
return здесь._дата_время.second
|
154
|
+
|
155
|
+
@property
|
156
|
+
def Микросекунд(здесь):
|
157
|
+
return здесь._дата_время.microsecond
|
158
|
+
|
159
|
+
@property
|
160
|
+
def Часовой_пояс(здесь):
|
161
|
+
return здесь._дата_время.tzinfo
|
162
|
+
|
163
|
+
class Дата:
|
164
|
+
def __init__(здесь, *ПА, **ИА):
|
165
|
+
if len(ПА) > 0 and type(ПА[0]) == datetime.date: здесь._дата = ПА[0]
|
166
|
+
else:
|
167
|
+
ИА = __Общие_функции__.Заменить_ключи_в_словаре(
|
168
|
+
ИА, Словарь_параметров
|
169
|
+
)
|
170
|
+
здесь._дата = datetime.date(*ПА, **ИА)
|
171
|
+
|
172
|
+
@staticmethod
|
173
|
+
def Сегодня():
|
174
|
+
return Дата(datetime.date.today())
|
175
|
+
|
176
|
+
@staticmethod
|
177
|
+
def От_даты(порядковый_номер):
|
178
|
+
return Дата(datetime.date.fromordinal(порядковый_номер))
|
179
|
+
|
180
|
+
def Формат(здесь, формат):
|
181
|
+
формат = Перевести_формат(формат)
|
182
|
+
return здесь._дата.strftime(формат)
|
183
|
+
|
184
|
+
def В_строку(здесь):
|
185
|
+
return здесь._дата.isoformat()
|
186
|
+
|
187
|
+
def День_недели(здесь):
|
188
|
+
return здесь._дата.isoweekday()
|
189
|
+
|
190
|
+
def Добавить(здесь, интервал):
|
191
|
+
return Дата(здесь._дата + интервал._интервал)
|
192
|
+
|
193
|
+
def Вычесть(здесь, интервал):
|
194
|
+
return Дата(здесь._дата - интервал._интервал)
|
195
|
+
|
196
|
+
def __add__(здесь, другой):
|
197
|
+
if isinstance(другой, Интервал):
|
198
|
+
return здесь.Добавить(другой)
|
199
|
+
return NotImplemented
|
200
|
+
|
201
|
+
def __radd__(здесь, другой):
|
202
|
+
if isinstance(другой, Интервал):
|
203
|
+
return здесь.Добавить(другой)
|
204
|
+
return NotImplemented
|
205
|
+
|
206
|
+
def __sub__(здесь, другой):
|
207
|
+
if isinstance(другой, Интервал):
|
208
|
+
return здесь.Вычесть(другой)
|
209
|
+
return NotImplemented
|
210
|
+
|
211
|
+
def __eq__(здесь, другой):
|
212
|
+
if isinstance(другой, Дата):
|
213
|
+
return здесь._дата == другой._дата
|
214
|
+
return NotImplemented
|
215
|
+
|
216
|
+
def __lt__(здесь, другой):
|
217
|
+
if isinstance(другой, Дата):
|
218
|
+
return здесь._дата < другой._дата
|
219
|
+
return NotImplemented
|
220
|
+
|
221
|
+
def __le__(здесь, другой):
|
222
|
+
if isinstance(другой, Дата):
|
223
|
+
return здесь._дата <= другой._дата
|
224
|
+
return NotImplemented
|
225
|
+
|
226
|
+
def __gt__(здесь, другой):
|
227
|
+
if isinstance(другой, Дата):
|
228
|
+
return здесь._дата > другой._дата
|
229
|
+
return NotImplemented
|
230
|
+
|
231
|
+
def __ge__(здесь, другой):
|
232
|
+
if isinstance(другой, Дата):
|
233
|
+
return здесь._дата >= другой._дата
|
234
|
+
return NotImplemented
|
235
|
+
|
236
|
+
@property
|
237
|
+
def год(здесь): return здесь._дата.year
|
238
|
+
|
239
|
+
@property
|
240
|
+
def месяц(здесь): return здесь._дата.month
|
241
|
+
|
242
|
+
@property
|
243
|
+
def день(здесь): return здесь._дата.day
|
244
|
+
|
245
|
+
class Время:
|
246
|
+
def __init__(здесь, *ПА, **ИА):
|
247
|
+
ИА = __Общие_функции__.Заменить_ключи_в_словаре(
|
248
|
+
ИА, Словарь_параметров
|
249
|
+
)
|
250
|
+
здесь._время = datetime.time(*ПА, **ИА)
|
251
|
+
|
252
|
+
def Формат(здесь, формат):
|
253
|
+
формат = Перевести_формат(формат)
|
254
|
+
return здесь._время.strftime(формат)
|
255
|
+
|
256
|
+
def В_строку(здесь):
|
257
|
+
return здесь._время.isoformat()
|
258
|
+
|
259
|
+
def Заменить(здесь, **ИА):
|
260
|
+
ИА = __Общие_функции__.Заменить_ключи_в_словаре(
|
261
|
+
ИА, Словарь_параметров
|
262
|
+
)
|
263
|
+
return Время(здесь._время.replace(**ИА))
|
264
|
+
|
265
|
+
def Добавить(здесь, интервал):
|
266
|
+
базовая_дата = datetime.datetime(1970, 1, 1, здесь._время.hour, здесь._время.minute, здесь._время.second, здесь._время.microsecond, здесь._время.tzinfo)
|
267
|
+
результат = базовая_дата + интервал._интервал
|
268
|
+
return Время(результат.hour, результат.minute, результат.second, результат.microsecond, здесь._время.tzinfo)
|
269
|
+
|
270
|
+
def Вычесть(здесь, интервал):
|
271
|
+
базовая_дата = datetime.datetime(1970, 1, 1, здесь._время.hour, здесь._время.minute, здесь._время.second, здесь._время.microsecond, здесь._время.tzinfo)
|
272
|
+
результат = базовая_дата - интервал._интервал
|
273
|
+
return Время(результат.hour, результат.minute, результат.second, результат.microsecond, здесь._время.tzinfo)
|
274
|
+
|
275
|
+
def __add__(здесь, другой):
|
276
|
+
if isinstance(другой, Интервал):
|
277
|
+
return здесь.Добавить(другой)
|
278
|
+
return NotImplemented
|
279
|
+
|
280
|
+
def __radd__(здесь, другой):
|
281
|
+
if isinstance(другой, Интервал):
|
282
|
+
return здесь.Добавить(другой)
|
283
|
+
return NotImplemented
|
284
|
+
|
285
|
+
def __sub__(здесь, другой):
|
286
|
+
if isinstance(другой, Интервал):
|
287
|
+
return здесь.Вычесть(другой)
|
288
|
+
return NotImplemented
|
289
|
+
|
290
|
+
def __eq__(здесь, другой):
|
291
|
+
if isinstance(другой, Время):
|
292
|
+
return здесь._время == другой._время
|
293
|
+
return NotImplemented
|
294
|
+
|
295
|
+
def __lt__(здесь, другой):
|
296
|
+
if isinstance(другой, Время):
|
297
|
+
return здесь._время < другой._время
|
298
|
+
return NotImplemented
|
299
|
+
|
300
|
+
def __le__(здесь, другой):
|
301
|
+
if isinstance(другой, Время):
|
302
|
+
return здесь._время <= другой._время
|
303
|
+
return NotImplemented
|
304
|
+
|
305
|
+
def __gt__(здесь, другой):
|
306
|
+
if isinstance(другой, Время):
|
307
|
+
return здесь._время > другой._время
|
308
|
+
return NotImplemented
|
309
|
+
|
310
|
+
def __ge__(здесь, другой):
|
311
|
+
if isinstance(другой, Время):
|
312
|
+
return здесь._время >= другой._время
|
313
|
+
return NotImplemented
|
314
|
+
|
315
|
+
@property
|
316
|
+
def Часов(здесь):
|
317
|
+
return здесь._время.hour
|
318
|
+
|
319
|
+
@property
|
320
|
+
def Минут(здесь):
|
321
|
+
return здесь._время.minute
|
322
|
+
|
323
|
+
@property
|
324
|
+
def Секунд(здесь):
|
325
|
+
return здесь._время.second
|
326
|
+
|
327
|
+
@property
|
328
|
+
def Микросекунд(здесь):
|
329
|
+
return здесь._время.microsecond
|
330
|
+
|
331
|
+
@property
|
332
|
+
def Часовой_пояс(здесь):
|
333
|
+
return здесь._время.tzinfo
|
334
|
+
|
335
|
+
class Интервал:
|
336
|
+
def __init__(здесь, *ПА, **ИА):
|
337
|
+
if len(ПА) > 0 and type(ПА[0]) == datetime.timedelta: здесь._интервал = ПА[0]
|
338
|
+
else:
|
339
|
+
ИА = __Общие_функции__.Заменить_ключи_в_словаре(
|
340
|
+
ИА, Словарь_параметров_интервала
|
341
|
+
)
|
342
|
+
здесь._интервал = datetime.timedelta(*ПА, **ИА)
|
343
|
+
|
344
|
+
def Добавить(здесь, другой):
|
345
|
+
return Интервал(дней=(здесь._интервал + другой._интервал).days, секунд=(здесь._интервал + другой._интервал).seconds, микросекунд=(здесь._интервал + другой._интервал).microseconds)
|
346
|
+
|
347
|
+
def Вычесть(здесь, другой):
|
348
|
+
return Интервал(дней=(здесь._интервал - другой._интервал).days, секунд=(здесь._интервал - другой._интервал).seconds, микросекунд=(здесь._интервал - другой._интервал).microseconds)
|
349
|
+
|
350
|
+
def __add__(здесь, другой):
|
351
|
+
if isinstance(другой, Интервал):
|
352
|
+
return здесь.Добавить(другой)
|
353
|
+
return NotImplemented
|
354
|
+
|
355
|
+
def __sub__(здесь, другой):
|
356
|
+
if isinstance(другой, Интервал):
|
357
|
+
return здесь.Вычесть(другой)
|
358
|
+
return NotImplemented
|
359
|
+
|
360
|
+
def __eq__(здесь, другой):
|
361
|
+
if isinstance(другой, Интервал):
|
362
|
+
return здесь._интервал == другой._интервал
|
363
|
+
return NotImplemented
|
364
|
+
|
365
|
+
def __lt__(здесь, другой):
|
366
|
+
if isinstance(другой, Интервал):
|
367
|
+
return здесь._интервал < другой._интервал
|
368
|
+
return NotImplemented
|
369
|
+
|
370
|
+
def __le__(здесь, другой):
|
371
|
+
if isinstance(другой, Интервал):
|
372
|
+
return здесь._интервал <= другой._интервал
|
373
|
+
return NotImplemented
|
374
|
+
|
375
|
+
def __gt__(здесь, другой):
|
376
|
+
if isinstance(другой, Интервал):
|
377
|
+
return здесь._интервал > другой._интервал
|
378
|
+
return NotImplemented
|
379
|
+
|
380
|
+
def __ge__(здесь, другой):
|
381
|
+
if isinstance(другой, Интервал):
|
382
|
+
return здесь._интервал >= другой._интервал
|
383
|
+
return NotImplemented
|
384
|
+
|
385
|
+
@property
|
386
|
+
def Дней(здесь):
|
387
|
+
return здесь._интервал.days
|
388
|
+
|
389
|
+
@property
|
390
|
+
def Секунд(здесь):
|
391
|
+
return здесь._интервал.seconds
|
392
|
+
|
393
|
+
@property
|
394
|
+
def Микросекунд(здесь):
|
395
|
+
return здесь._интервал.microseconds
|
396
|
+
|
397
|
+
@property
|
398
|
+
def Всего_секунд(здесь):
|
399
|
+
return здесь._интервал.total_seconds()
|
400
|
+
|
401
|
+
def Совместить(дата, время):
|
402
|
+
return Дата_время(datetime.datetime.combine(дата._дата, время._время))
|
403
|
+
|
404
|
+
class ДатаСтСт:
|
405
|
+
def __init__(здесь, *ПА):
|
406
|
+
if len(ПА) == 3:
|
407
|
+
здесь.год, здесь.месяц, здесь.день = ПА
|
408
|
+
здесь._Посчитать_дни()
|
409
|
+
else:
|
410
|
+
if isinstance(ПА[0], ДатаСтСт):
|
411
|
+
здесь.в_днях = ПА[0].в_днях
|
412
|
+
else:
|
413
|
+
здесь.в_днях = ПА[0]
|
414
|
+
здесь._Посчитать_дату()
|
415
|
+
|
416
|
+
def _Посчитать_день_недели_и_года(здесь):
|
417
|
+
здесь.день_недели = (здесь.в_днях - 1) % 7
|
418
|
+
if здесь.день_недели == 0: здесь.день_недели = 7
|
419
|
+
здесь.день_года = (
|
420
|
+
(275 * здесь.месяц // 9)
|
421
|
+
- (((здесь.месяц + 9) // 12) * (1 + ((здесь.год - 4 * (здесь.год // 4) + 2) // 3)))
|
422
|
+
+ здесь.день
|
423
|
+
- 31
|
424
|
+
)
|
425
|
+
|
426
|
+
def _Посчитать_дни(здесь):
|
427
|
+
здесь.в_днях = (
|
428
|
+
367 * здесь.год
|
429
|
+
- int((7 * (здесь.год + 5001 + int((здесь.месяц - 9) / 7))) / 4)
|
430
|
+
+ int((275 * здесь.месяц) / 9)
|
431
|
+
+ здесь.день
|
432
|
+
+ 8353
|
433
|
+
)
|
434
|
+
здесь._Посчитать_день_недели_и_года()
|
435
|
+
|
436
|
+
def _Посчитать_дату(здесь):
|
437
|
+
a = здесь.в_днях + 1890
|
438
|
+
b = int((a - 122.1) / 365.25)
|
439
|
+
c = int(365.25 * b)
|
440
|
+
d = int((a - c) / 30.6001)
|
441
|
+
здесь.день = a - c - int(30.6001 * d)
|
442
|
+
здесь.месяц = d - (13 if d > 13 else 1)
|
443
|
+
здесь.год = b - (3 if здесь.месяц < 3 else 4)
|
444
|
+
здесь._Посчитать_день_недели_и_года()
|
445
|
+
|
446
|
+
def Добавить_дни(здесь, количество):
|
447
|
+
здесь.в_днях += количество
|
448
|
+
здесь._Посчитать_дату()
|
449
|
+
return здесь
|
450
|
+
|
451
|
+
def Разница_в_днях(здесь, другая_дата):
|
452
|
+
return здесь.в_днях - другая_дата.в_днях
|
453
|
+
|
454
|
+
def Сравнить(здесь, другая_дата):
|
455
|
+
if здесь.в_днях < другая_дата.в_днях: return -1
|
456
|
+
elif здесь.в_днях > другая_дата.в_днях: return 1
|
457
|
+
else: return 0
|
458
|
+
|
459
|
+
def В_новый_стиль(здесь):
|
460
|
+
разница = здесь.год // 100 - здесь.год // 400 - 2
|
461
|
+
год_увеличения_разницы = здесь.год % 100 == 0 and здесь.год % 400 != 0
|
462
|
+
if год_увеличения_разницы:
|
463
|
+
if здесь.день_года < 60: разница -= 1
|
464
|
+
if здесь.день_года == 59 and год_увеличения_разницы:
|
465
|
+
дата = Дата(здесь.год, 3, 1) + Интервал(дней = разница)
|
466
|
+
else:
|
467
|
+
дата = Дата(здесь.год, здесь.месяц, здесь.день)
|
468
|
+
дата += Интервал(дней = разница)
|
469
|
+
return дата
|
470
|
+
|
471
|
+
def Пасха(год, нов_ст = None):
|
472
|
+
смещение = (год % 19 * 19 + 15) % 30
|
473
|
+
смещение += (год % 4 * 2 + год % 7 * 4 + 6 * смещение + 6) % 7
|
474
|
+
нов_ст = True if нов_ст is None and год >= 1918 else нов_ст
|
475
|
+
дата = ДатаСтСт(год, 3, 22)
|
476
|
+
дата.Добавить_дни(смещение)
|
477
|
+
if нов_ст: return дата.В_новый_стиль()
|
478
|
+
else: return дата
|
@@ -1,4 +1,5 @@
|
|
1
1
|
import re
|
2
|
+
from rupython import __Общие_функции__
|
2
3
|
|
3
4
|
БезФлагов = 0
|
4
5
|
Знаки7бит = A = re.ASCII
|
@@ -19,42 +20,42 @@ class Шаблон:
|
|
19
20
|
здесь.шаблон = объект.pattern
|
20
21
|
|
21
22
|
def Поиск(здесь, *ПА, **ИА):
|
22
|
-
ИА = __
|
23
|
+
ИА = __Общие_функции__.Заменить_ключи_в_словаре(ИА, \
|
23
24
|
{ 'строка': 'string', 'нач_поз': 'pos', 'кон_поз': 'endpos' })
|
24
25
|
return здесь.объект.search(*ПА, **ИА)
|
25
26
|
|
26
27
|
def СовпадНач(здесь, *ПА, **ИА):
|
27
|
-
ИА = __
|
28
|
+
ИА = __Общие_функции__.Заменить_ключи_в_словаре(ИА, \
|
28
29
|
{ 'строка': 'string', 'нач_поз': 'pos', 'кон_поз': 'endpos' })
|
29
30
|
return здесь.объект.match(*ПА, **ИА)
|
30
31
|
|
31
32
|
def ПолнСоотв(здесь, *ПА, **ИА):
|
32
|
-
ИА = __
|
33
|
+
ИА = __Общие_функции__.Заменить_ключи_в_словаре(ИА, \
|
33
34
|
{ 'строка': 'string', 'нач_поз': 'pos', 'кон_поз': 'endpos' })
|
34
35
|
return здесь.объект.fullmatch(*ПА, **ИА)
|
35
36
|
|
36
37
|
def Разбить(здесь, *ПА, **ИА):
|
37
|
-
ИА = __
|
38
|
+
ИА = __Общие_функции__.Заменить_ключи_в_словаре(ИА, \
|
38
39
|
{ 'строка': 'string', 'макс_делений': 'maxsplit' })
|
39
40
|
return здесь.объект.split(*ПА, **ИА)
|
40
41
|
|
41
42
|
def НайтиВсё(здесь, *ПА, **ИА):
|
42
|
-
ИА = __
|
43
|
+
ИА = __Общие_функции__.Заменить_ключи_в_словаре(ИА, \
|
43
44
|
{ 'строка': 'string', 'нач_поз': 'pos', 'кон_поз': 'endpos' })
|
44
45
|
return здесь.объект.findall(*ПА, **ИА)
|
45
46
|
|
46
47
|
def ИскатьПеречисл(здесь, *ПА, **ИА):
|
47
|
-
ИА = __
|
48
|
+
ИА = __Общие_функции__.Заменить_ключи_в_словаре(ИА, \
|
48
49
|
{ 'строка': 'string', 'нач_поз': 'pos', 'кон_поз': 'endpos' })
|
49
50
|
return здесь.объект.finditer(*ПА, **ИА)
|
50
51
|
|
51
52
|
def Заменить(здесь, *ПА, **ИА):
|
52
|
-
ИА = __
|
53
|
+
ИА = __Общие_функции__.Заменить_ключи_в_словаре(ИА, \
|
53
54
|
{ 'замена': 'repl', 'строка': 'string', 'количество': 'count' })
|
54
55
|
return здесь.объект.sub(*ПА, **ИА)
|
55
56
|
|
56
57
|
def ЗаменитьСч(здесь, *ПА, **ИА):
|
57
|
-
ИА = __
|
58
|
+
ИА = __Общие_функции__.Заменить_ключи_в_словаре(ИА, \
|
58
59
|
{ 'замена': 'repl', 'строка': 'string', 'количество': 'count' })
|
59
60
|
return здесь.объект.subn(*ПА, **ИА)
|
60
61
|
|
@@ -74,11 +75,11 @@ class Соответствие:
|
|
74
75
|
def __getitem__(здесь, индекс): return объект[индекс]
|
75
76
|
|
76
77
|
def Группы(здесь, *ПА, **ИА):
|
77
|
-
ИА = __
|
78
|
+
ИА = __Общие_функции__.Заменить_ключи_в_словаре(ИА, { 'по_умолчанию': 'default' })
|
78
79
|
return здесь.объект.groups(*ПА, **ИА)
|
79
80
|
|
80
81
|
def ИменовГруппы(здесь, *ПА, **ИА):
|
81
|
-
ИА = __
|
82
|
+
ИА = __Общие_функции__.Заменить_ключи_в_словаре(ИА, { 'по_умолчанию': 'default' })
|
82
83
|
return здесь.объект.groupdict(*ПА, **ИА)
|
83
84
|
|
84
85
|
def Начало(здесь, *группа): return здесь.объект.start(*группа)
|
@@ -1,4 +1,5 @@
|
|
1
1
|
import random
|
2
|
+
from rupython import __Общие_функции__
|
2
3
|
|
3
4
|
# Управление
|
4
5
|
def НачЗнач(a = None): return random.seed(a, version = 2)
|
@@ -10,7 +11,7 @@ def СлучБайты(n): return random.randbytes(n)
|
|
10
11
|
|
11
12
|
# Целые числа
|
12
13
|
def ИзДиапазона(*ПА, **ИА):
|
13
|
-
ИА = __
|
14
|
+
ИА = __Общие_функции__.Заменить_ключи_в_словаре(ИА, \
|
14
15
|
{ 'нач': 'start', 'кон': 'stop', 'шаг': 'step' })
|
15
16
|
return random.randrange(*ПА, **ИА)
|
16
17
|
def СлучЦелое(a, b): return random.randint(a, b)
|
@@ -19,12 +20,12 @@ def СлучБиты(k): return random.getrandbits(k)
|
|
19
20
|
# Последовательности
|
20
21
|
def ВыбратьИзПосл(посл): return random.choice(посл)
|
21
22
|
def ВыбратьПосл(*ПА, **ИА):
|
22
|
-
ИА = __
|
23
|
+
ИА = __Общие_функции__.Заменить_ключи_в_словаре(ИА, \
|
23
24
|
{ 'посл': 'population', 'веса': 'weights', 'накоплВеса': 'cum_weights' })
|
24
25
|
return random.choices(*ПА, **ИА)
|
25
26
|
def Перемешать(x): return random.shuffle(x)
|
26
27
|
def СлучПосл(*ПА, **ИА):
|
27
|
-
ИА = __
|
28
|
+
ИА = __Общие_функции__.Заменить_ключи_в_словаре(ИА, \
|
28
29
|
{ 'посл': 'population', 'колич': 'counts' })
|
29
30
|
return random.sample(*ПА, **ИА)
|
30
31
|
|
@@ -5,6 +5,7 @@ import os as ОС
|
|
5
5
|
import sys as Система
|
6
6
|
import importlib as Импортование
|
7
7
|
import re as РегВыр
|
8
|
+
from io import StringIO as СтроковыйВВ
|
8
9
|
|
9
10
|
Служебные_слова = {
|
10
11
|
'Да': 'True',
|
@@ -362,6 +363,59 @@ def Заменить_встроенные_функции(слова, соотв
|
|
362
363
|
слова[сч] = (1, соответствие[1][слова[сч][1]], слова[сч][2])
|
363
364
|
сч += 1
|
364
365
|
|
366
|
+
def Обработать_f_строки(слова, путь_к_файлу):
|
367
|
+
номер = 0
|
368
|
+
while номер < len(слова):
|
369
|
+
if слова[номер][0] == 3 and слова[номер][1].startswith(("f'", 'f"')):
|
370
|
+
отступов = слова[номер][2]
|
371
|
+
исходная_строка = слова[номер][1]
|
372
|
+
префикс = 'f' if исходная_строка.startswith('f') else исходная_строка[0]
|
373
|
+
кавычка = исходная_строка[1]
|
374
|
+
содержимое = исходная_строка[2:-1] if исходная_строка.endswith(кавычка) else исходная_строка[2:]
|
375
|
+
новые_токены = []
|
376
|
+
поз = 0
|
377
|
+
while поз < len(содержимое):
|
378
|
+
if поз + 1 < len(содержимое) and содержимое[поз:поз+2] == '{{':
|
379
|
+
новые_токены.append((3, '{{', отступов))
|
380
|
+
поз += 2
|
381
|
+
elif поз + 1 < len(содержимое) and содержимое[поз:поз+2] == '}}':
|
382
|
+
новые_токены.append((3, '}}', отступов))
|
383
|
+
поз += 2
|
384
|
+
elif содержимое[поз] == '{':
|
385
|
+
уровень_скобок = 1
|
386
|
+
нач_поз = поз + 1
|
387
|
+
поз += 1
|
388
|
+
while поз < len(содержимое) and уровень_скобок > 0:
|
389
|
+
if содержимое[поз] == '{':
|
390
|
+
уровень_скобок += 1
|
391
|
+
elif содержимое[поз] == '}':
|
392
|
+
уровень_скобок -= 1
|
393
|
+
поз += 1
|
394
|
+
if уровень_скобок != 0:
|
395
|
+
искл = SyntaxError('Незакрытое выражение в f-строке')
|
396
|
+
Вывести_текст_исключения(искл, 'при разборе f-строки', путь_к_файлу)
|
397
|
+
выражение = содержимое[нач_поз:поз-1]
|
398
|
+
try:
|
399
|
+
токены_выражения = list(Разборщик_слов.generate_tokens(СтроковыйВВ(выражение).readline))
|
400
|
+
токены_выражения = [(ток.type, ток.string, отступов) for ток in токены_выражения if ток.type != Разборщик_слов.ENDMARKER]
|
401
|
+
Выполнить_основные_замены(токены_выражения, Служебные_слова)
|
402
|
+
Выполнить_основные_замены(токены_выражения, Специальные_названия)
|
403
|
+
Выполнить_основные_замены(токены_выражения, Исключения)
|
404
|
+
Заменить_встроенные_функции(токены_выражения, Встроенные_функции)
|
405
|
+
выражение_текст = Разборщик_слов.untokenize((ток[0], ток[1]) for ток in токены_выражения if ток[0] not in (4, 5, 6)).strip()
|
406
|
+
новые_токены.append((3, '{' + выражение_текст + '}', отступов))
|
407
|
+
except Exception as ошибка:
|
408
|
+
Вывести_текст_исключения(ошибка, 'при разборе выражения в f-строке', путь_к_файлу)
|
409
|
+
else:
|
410
|
+
нач_поз = поз
|
411
|
+
while поз < len(содержимое) and содержимое[поз] not in ['{', '}']:
|
412
|
+
поз += 1
|
413
|
+
if нач_поз != поз:
|
414
|
+
новые_токены.append((3, содержимое[нач_поз:поз], отступов))
|
415
|
+
новая_строка = f"f{кавычка}{''.join(ток[1] for ток in новые_токены)}{кавычка}"
|
416
|
+
слова[номер] = (3, новая_строка, отступов)
|
417
|
+
номер += 1
|
418
|
+
|
365
419
|
def Посчитать_номер_строки(слова, позиция):
|
366
420
|
переводов = 0
|
367
421
|
for сч in range(позиция):
|
@@ -466,7 +520,7 @@ def Преобразовать_код(путь_к_файлу):
|
|
466
520
|
слова = list(Прочитать_слова(файл.readline, путь_к_файлу))
|
467
521
|
if not Проверить_соответствие_слов(слова, путь_к_файлу): return
|
468
522
|
|
469
|
-
#
|
523
|
+
# Обрабатываем импорты
|
470
524
|
импорты = []
|
471
525
|
строки_импорта = []
|
472
526
|
for поз in [i for i, x in enumerate(слова) if x[1] == 'Подключить' or x[1] == 'подключить']:
|
@@ -492,10 +546,12 @@ def Преобразовать_код(путь_к_файлу):
|
|
492
546
|
импорты.append(импорт)
|
493
547
|
for импорт in импорты: Обработать_импорт(импорт, путь_к_файлу)
|
494
548
|
|
549
|
+
# Выполняем замены
|
495
550
|
Выполнить_основные_замены(слова, Служебные_слова)
|
496
551
|
Выполнить_основные_замены(слова, Специальные_названия)
|
497
552
|
Выполнить_основные_замены(слова, Исключения)
|
498
553
|
Заменить_встроенные_функции(слова, Встроенные_функции)
|
554
|
+
Обработать_f_строки(слова, путь_к_файлу)
|
499
555
|
|
500
556
|
# Обрабатываем цикл со счётчиком
|
501
557
|
сдвиг = 0
|
@@ -0,0 +1,14 @@
|
|
1
|
+
rupython/__main__.py,sha256=wfmjyJhg6iQN1_9Hl6tIu6mKHO95xP2ibVcDdIIEXjE,1256
|
2
|
+
rupython/__Заголовочный_код__.py,sha256=VWghfQc6dv9lwIeQvJotpdOlBtHZeN00NBeL4RdWloA,10998
|
3
|
+
rupython/__Общие_функции__.py,sha256=FLbN5hhnnXXqAwqRRNJ2Y_0fXAAYCC_7Pn06_DZjX3w,826
|
4
|
+
rupython/Преобразователь.py,sha256=-0oxZb63T3s50sT-0jiH3cA4KqRs3qVpaGsfSyAb8TY,47550
|
5
|
+
rupython/Модули/БД.py,sha256=ypjYa-9s0wO1Y_nXRiyiS80F_TStRlsSHRpisBWMT4g,23957
|
6
|
+
rupython/Модули/ДатаВремя.py,sha256=LP3yb9QhlygCl2EzonIZ68QTOSOsKW2JSzcIAXvTeVw,20698
|
7
|
+
rupython/Модули/Матем.py,sha256=d8ekm7GJreu7LJ9KmAKcTOciIUQ-VBI567BfK_QeLSc,3587
|
8
|
+
rupython/Модули/РегВыр.py,sha256=T3yxVP-B5AwAzbUTjWpog3HCzRTGLZ58CEQpfA-0dsY,6341
|
9
|
+
rupython/Модули/Случ.py,sha256=foIuQo2QZ5z0iyxp9fn4NaunSx96vYzC2pRjwaT2FD8,2723
|
10
|
+
rupython-1.2.3.dist-info/LICENSE,sha256=iWzdt1wyTlK8qNSu7TzK8pjjIcCvLvWHycp7ACRcWEc,59
|
11
|
+
rupython-1.2.3.dist-info/METADATA,sha256=lbLqgBZjgn1VDWwPR-7G2r745tjoddi-K-LtFYdNcmw,27473
|
12
|
+
rupython-1.2.3.dist-info/WHEEL,sha256=P9jw-gEje8ByB7_hXoICnHtVCrEwMQh-630tKvQWehc,91
|
13
|
+
rupython-1.2.3.dist-info/top_level.txt,sha256=GtXaS8JTsBm5hpQxxtQlrxK6rExvSAK_Cp44FrY4210,9
|
14
|
+
rupython-1.2.3.dist-info/RECORD,,
|
rupython-1.2.1.dist-info/RECORD
DELETED
@@ -1,12 +0,0 @@
|
|
1
|
-
rupython/__main__.py,sha256=fBgJ_gMHKBOIoZZIyLDecfjuOWxIwb5N0xEphsWUUvw,1183
|
2
|
-
rupython/__Заголовочный_код__.py,sha256=VWghfQc6dv9lwIeQvJotpdOlBtHZeN00NBeL4RdWloA,10998
|
3
|
-
rupython/Преобразователь.py,sha256=JHdyCJWRBZxxm-kzBBW_pGobWJZxVaewBDdfUU2Av8E,42957
|
4
|
-
rupython/Модули/БД.py,sha256=ZgMDbvr7Q_oYY4qQVyOo7VaDjeSYRwdX8rn7Ur7SbR0,23947
|
5
|
-
rupython/Модули/Матем.py,sha256=d8ekm7GJreu7LJ9KmAKcTOciIUQ-VBI567BfK_QeLSc,3587
|
6
|
-
rupython/Модули/РегВыр.py,sha256=yeXYfeDF2qw4DSKVdZVSFInMUW52U7Nq_KOJKvm4XnM,6349
|
7
|
-
rupython/Модули/Случ.py,sha256=oeVdSdFVb4X_T-nX2P7NSIhise1zUPIS4lk7h-67XSg,2689
|
8
|
-
rupython-1.2.1.dist-info/LICENSE,sha256=iWzdt1wyTlK8qNSu7TzK8pjjIcCvLvWHycp7ACRcWEc,59
|
9
|
-
rupython-1.2.1.dist-info/METADATA,sha256=acR1BOTh-XzBZrBWBinn1-lBcFe5TrDhTbUCU7xxs-E,27473
|
10
|
-
rupython-1.2.1.dist-info/WHEEL,sha256=P9jw-gEje8ByB7_hXoICnHtVCrEwMQh-630tKvQWehc,91
|
11
|
-
rupython-1.2.1.dist-info/top_level.txt,sha256=GtXaS8JTsBm5hpQxxtQlrxK6rExvSAK_Cp44FrY4210,9
|
12
|
-
rupython-1.2.1.dist-info/RECORD,,
|
File without changes
|
File without changes
|
File without changes
|