rupython 1.4.11__tar.gz → 1.4.13__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 (26) hide show
  1. {rupython-1.4.11 → rupython-1.4.13}/PKG-INFO +3 -3
  2. {rupython-1.4.11 → rupython-1.4.13}/README.md +2 -2
  3. {rupython-1.4.11 → rupython-1.4.13}/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 +3 -3
  4. {rupython-1.4.11 → rupython-1.4.13}/rupython//320/234/320/276/320/264/321/203/320/273/320/270//320/221/320/224.py +6 -6
  5. rupython-1.4.13/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 +565 -0
  6. {rupython-1.4.11 → rupython-1.4.13}/rupython//320/234/320/276/320/264/321/203/320/273/320/270//320/241/320/270/321/201/321/202/320/265/320/274/320/260.py +10 -0
  7. {rupython-1.4.11 → rupython-1.4.13}/rupython//320/234/320/276/320/264/321/203/320/273/320/270//320/241/320/273/321/203/321/207.py +6 -6
  8. {rupython-1.4.11 → rupython-1.4.13}/rupython//320/234/320/276/320/264/321/203/320/273/320/270//320/244/320/260/320/271/320/273/321/213.py +24 -12
  9. {rupython-1.4.11 → rupython-1.4.13}/rupython.egg-info/PKG-INFO +3 -3
  10. {rupython-1.4.11 → rupython-1.4.13}/setup.py +1 -1
  11. rupython-1.4.11/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 -565
  12. {rupython-1.4.11 → rupython-1.4.13}/LICENSE +0 -0
  13. {rupython-1.4.11 → rupython-1.4.13}/rupython/__main__.py +0 -0
  14. {rupython-1.4.11 → rupython-1.4.13}/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
  15. {rupython-1.4.11 → rupython-1.4.13}/rupython//320/234/320/276/320/264/321/203/320/273/320/270//320/220/321/201/320/270/320/275/321/205/321/200/320/276/320/275/320/275/320/276/321/201/321/202/321/214.py" +0 -0
  16. {rupython-1.4.11 → rupython-1.4.13}/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" +0 -0
  17. {rupython-1.4.11 → rupython-1.4.13}/rupython//320/234/320/276/320/264/321/203/320/273/320/270//320/232/321/203/321/207/320/260.py" +0 -0
  18. {rupython-1.4.11 → rupython-1.4.13}/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
  19. {rupython-1.4.11 → rupython-1.4.13}/rupython//320/234/320/276/320/264/321/203/320/273/320/270//320/236/321/207/320/265/321/200/320/265/320/264/321/214.py" +0 -0
  20. {rupython-1.4.11 → rupython-1.4.13}/rupython//320/234/320/276/320/264/321/203/320/273/320/270//320/237/320/276/321/202/320/276/320/272/320/270.py" +0 -0
  21. {rupython-1.4.11 → rupython-1.4.13}/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
  22. {rupython-1.4.11 → rupython-1.4.13}/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
  23. {rupython-1.4.11 → rupython-1.4.13}/rupython.egg-info/SOURCES.txt +0 -0
  24. {rupython-1.4.11 → rupython-1.4.13}/rupython.egg-info/dependency_links.txt +0 -0
  25. {rupython-1.4.11 → rupython-1.4.13}/rupython.egg-info/top_level.txt +0 -0
  26. {rupython-1.4.11 → rupython-1.4.13}/setup.cfg +0 -0
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.4
2
2
  Name: rupython
3
- Version: 1.4.11
3
+ Version: 1.4.13
4
4
  Summary: Исполнитель кода Русского Питона
5
5
  Home-page: https://gitflic.ru/project/russky/rupython
6
6
  Author: Сообщество русских программистов
@@ -267,7 +267,7 @@ x = 0
267
267
  ##### Контекстный менеджер
268
268
  ```
269
269
  Используя Открыть('Файл.дан', 'r') как файл:
270
- Пока стр := файл.Читать_строку():
270
+ Пока стр := файл.Прочитать_строку():
271
271
  Вывести(стр.Удалить_по_бокам())
272
272
  ```
273
273
 
@@ -665,7 +665,7 @@ x = 0
665
665
  Методы:
666
666
 
667
667
  - `Читать([размер])` — чтение данных (байтов или символов).
668
- - `Читать_строку([размер])` — чтение одной строки.
668
+ - `Прочитать_строку([размер])` — чтение одной строки.
669
669
  - `Писать(данные)` — запись данных (строки или байтов).
670
670
  - `Позиция()` — возвращает текущую позицию указателя.
671
671
  - `Задать_позицию(смещение[, откуда])` — изменение позиции указателя файла.
@@ -241,7 +241,7 @@ x = 0
241
241
  ##### Контекстный менеджер
242
242
  ```
243
243
  Используя Открыть('Файл.дан', 'r') как файл:
244
- Пока стр := файл.Читать_строку():
244
+ Пока стр := файл.Прочитать_строку():
245
245
  Вывести(стр.Удалить_по_бокам())
246
246
  ```
247
247
 
@@ -639,7 +639,7 @@ x = 0
639
639
  Методы:
640
640
 
641
641
  - `Читать([размер])` — чтение данных (байтов или символов).
642
- - `Читать_строку([размер])` — чтение одной строки.
642
+ - `Прочитать_строку([размер])` — чтение одной строки.
643
643
  - `Писать(данные)` — запись данных (строки или байтов).
644
644
  - `Позиция()` — возвращает текущую позицию указателя.
645
645
  - `Задать_позицию(смещение[, откуда])` — изменение позиции указателя файла.
@@ -34,7 +34,7 @@ def Установить_поле(класс, атрибут, значение):
34
34
  'lower': 'В_строчные',
35
35
  'startswith': 'Начинается',
36
36
  'endswith': 'Кончается',
37
- 'join': 'Сцепить', # Присоединить
37
+ 'join': 'Сцепить', # Соединить
38
38
  'capitalize': 'Начать_с_заглавной',
39
39
  'center': 'Отцентровать',
40
40
  'count': 'Число_вхождений',
@@ -134,9 +134,9 @@ def Установить_поле(класс, атрибут, значение):
134
134
  'conjugate': 'Cопряжённое'
135
135
  },
136
136
  ('BufferedReader', 'BufferedWriter', 'TextIOWrapper'): {
137
- 'read': 'Прочитать', # Читать
137
+ 'read': 'Читать', # Прочитать
138
138
  'readline': 'Прочитать_строку', # Читать_строку
139
- 'write': 'Записать', # Писать
139
+ 'write': 'Писать', # Записать
140
140
  'tell': 'Позиция',
141
141
  'seek': 'Задать_позицию',
142
142
  'truncate': 'Обрезать', # Усечь
@@ -545,21 +545,21 @@ class Соединение():
545
545
  except Ошибка as ош:
546
546
  raise Ошибка(Перевести_ошибку(ош)) from ош
547
547
 
548
- def Создать_функцию(экземпляр, имя, количество_параметров, функция):
548
+ def Создать_функцию(экземпляр, название, количество_параметров, функция):
549
549
  try:
550
- экземпляр._соединение.create_function(имя, количество_параметров, функция)
550
+ экземпляр._соединение.create_function(название, количество_параметров, функция)
551
551
  except Ошибка as ош:
552
552
  raise Ошибка(Перевести_ошибку(ош)) from ош
553
553
 
554
- def Создать_агрегатную_функцию(экземпляр, имя, число_аргументов, класс):
554
+ def Создать_агрегатную_функцию(экземпляр, название, число_аргументов, класс):
555
555
  try:
556
- экземпляр._соединение.create_aggregate(имя, число_аргументов, класс)
556
+ экземпляр._соединение.create_aggregate(название, число_аргументов, класс)
557
557
  except Ошибка as ош:
558
558
  raise Ошибка(Перевести_ошибку(ош)) from ош
559
559
 
560
- def Создать_сопоставление(экземпляр, имя, функция):
560
+ def Создать_сопоставление(экземпляр, название, функция):
561
561
  try:
562
- экземпляр._соединение.create_collation(имя, функция)
562
+ экземпляр._соединение.create_collation(название, функция)
563
563
  except Ошибка as ош:
564
564
  raise Ошибка(Перевести_ошибку(ош)) from ош
565
565
 
@@ -0,0 +1,565 @@
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
+ Месяцы_родительный = {
35
+ 1: 'января', 2: 'февраля', 3: 'марта', 4: 'апреля',
36
+ 5: 'мая', 6: 'июня', 7: 'июля', 8: 'августа',
37
+ 9: 'сентября', 10: 'октября', 11: 'ноября', 12: 'декабря'
38
+ }
39
+
40
+ Дни_недели_полные = {
41
+ 1: 'понедельник', 2: 'вторник', 3: 'среда', 4: 'четверг',
42
+ 5: 'пятница', 6: 'суббота', 7: 'воскресенье'
43
+ }
44
+
45
+ Дни_недели_краткие = {
46
+ 1: 'Пн', 2: 'Вт', 3: 'Ср', 4: 'Чт',
47
+ 5: 'Пт', 6: 'Сб', 7: 'Вс'
48
+ }
49
+
50
+ def Склонение_после_числительного(число, слова):
51
+ return str(число) + ' ' + \
52
+ (слова[2] if число % 100 >= 5 and число % 100 <= 20 else \
53
+ (слова[0] if число % 10 == 1 else \
54
+ (слова[1] if число % 10 >= 2 and число % 10 <= 4 else слова[2])))
55
+
56
+ def Перевести_формат(формат):
57
+ for русский, питоновский in Словарь_спецификаторов.items():
58
+ формат = формат.replace(русский, питоновский)
59
+ return формат
60
+
61
+ class Дата_и_время:
62
+ def __init__(экземпляр, *ПА, **ИА):
63
+ if len(ПА) > 0 and type(ПА[0]) == datetime.datetime: экземпляр._дата_время = ПА[0]
64
+ else:
65
+ ИА = __Общие_функции__.Заменить_ключи_в_словаре(
66
+ ИА, Словарь_параметров
67
+ )
68
+ экземпляр._дата_время = datetime.datetime(*ПА, **ИА)
69
+
70
+ @staticmethod
71
+ def Сейчас(часовой_пояс = None):
72
+ return Дата_и_время(datetime.datetime.now(часовой_пояс))
73
+
74
+ @staticmethod
75
+ def Из_метки_времени(метка_времени, часовой_пояс = None):
76
+ return Дата_и_время(datetime.datetime.fromtimestamp(метка_времени, часовой_пояс))
77
+
78
+ @staticmethod
79
+ def Из_строки(строка):
80
+ return Дата_и_время.Разобрать(строка, Формат_даты_и_времени)
81
+
82
+ @staticmethod
83
+ def Разобрать(строка, формат):
84
+ формат = Перевести_формат(формат)
85
+ return Дата_и_время(datetime.datetime.strptime(строка, формат))
86
+
87
+ def В_формат(экземпляр, формат):
88
+ формат = Перевести_формат(формат)
89
+ return экземпляр._дата_время.strftime(формат)
90
+
91
+ def __str__(экземпляр):
92
+ формат = Перевести_формат(Формат_даты_и_времени)
93
+ return экземпляр._дата_время.strftime(формат)
94
+
95
+ def Словами(экземпляр, формат = 'полный'):
96
+ день_недели = экземпляр.Номер_дня_недели()
97
+ if формат == 'полный':
98
+ return f"{Дни_недели_полные[день_недели]}, {экземпляр.День} {Месяцы_родительный[экземпляр.Месяц]} {экземпляр.Год} года, {экземпляр.Часов:02d}:{экземпляр.Минут:02d}"
99
+ elif формат == 'краткий':
100
+ return f"{Дни_недели_краткие[день_недели]}, {экземпляр.День} {Месяцы_родительный[экземпляр.Месяц]} {экземпляр.Год} г."
101
+ elif формат == 'дата':
102
+ return f"{экземпляр.День} {Месяцы_родительный[экземпляр.Месяц]} {экземпляр.Год} года"
103
+ elif формат == 'время':
104
+ return f"{экземпляр.Часов:02d}:{экземпляр.Минут:02d}"
105
+ elif формат == 'день_недели':
106
+ return Дни_недели_полные[день_недели]
107
+ else:
108
+ raise ValueError("Неподдерживаемый формат")
109
+
110
+ def В_метку_времени(экземпляр):
111
+ return экземпляр._дата_время.timestamp()
112
+
113
+ def День_недели(экземпляр):
114
+ return экземпляр._дата_время.weekday()
115
+
116
+ def Номер_дня_недели(экземпляр):
117
+ return экземпляр._дата_время.isoweekday()
118
+
119
+ def Добавить(экземпляр, интервал):
120
+ return Дата_и_время(экземпляр._дата_время + интервал._интервал)
121
+
122
+ def Вычесть(экземпляр, интервал):
123
+ return Дата_и_время(экземпляр._дата_время - интервал._интервал)
124
+
125
+ def __add__(экземпляр, другой):
126
+ if isinstance(другой, Интервал):
127
+ return экземпляр.Добавить(другой)
128
+ return NotImplemented
129
+
130
+ def __radd__(экземпляр, другой):
131
+ if isinstance(другой, Интервал):
132
+ return экземпляр.Добавить(другой)
133
+ return NotImplemented
134
+
135
+ def __sub__(экземпляр, другой):
136
+ if isinstance(другой, Интервал):
137
+ return экземпляр.Вычесть(другой)
138
+ return NotImplemented
139
+
140
+ def __eq__(экземпляр, другой):
141
+ if isinstance(другой, Дата_и_время):
142
+ return экземпляр._дата_время == другой._дата_время
143
+ return NotImplemented
144
+
145
+ def __lt__(экземпляр, другой):
146
+ if isinstance(другой, Дата_и_время):
147
+ return экземпляр._дата_время < другой._дата_время
148
+ return NotImplemented
149
+
150
+ def __le__(экземпляр, другой):
151
+ if isinstance(другой, Дата_и_время):
152
+ return экземпляр._дата_время <= другой._дата_время
153
+ return NotImplemented
154
+
155
+ def __gt__(экземпляр, другой):
156
+ if isinstance(другой, Дата_и_время):
157
+ return экземпляр._дата_время > другой._дата_время
158
+ return NotImplemented
159
+
160
+ def __ge__(экземпляр, другой):
161
+ if isinstance(другой, Дата_и_время):
162
+ return экземпляр._дата_время >= другой._дата_время
163
+ return NotImplemented
164
+
165
+ def __format__(экземпляр, формат):
166
+ return экземпляр.В_формат(формат)
167
+
168
+ @property
169
+ def Год(экземпляр):
170
+ return экземпляр._дата_время.year
171
+
172
+ @property
173
+ def Месяц(экземпляр):
174
+ return экземпляр._дата_время.month
175
+
176
+ @property
177
+ def День(экземпляр):
178
+ return экземпляр._дата_время.day
179
+
180
+ @property
181
+ def Часов(экземпляр):
182
+ return экземпляр._дата_время.hour
183
+
184
+ @property
185
+ def Минут(экземпляр):
186
+ return экземпляр._дата_время.minute
187
+
188
+ @property
189
+ def Секунд(экземпляр):
190
+ return экземпляр._дата_время.second
191
+
192
+ @property
193
+ def Микросекунд(экземпляр):
194
+ return экземпляр._дата_время.microsecond
195
+
196
+ @property
197
+ def Часовой_пояс(экземпляр):
198
+ return экземпляр._дата_время.tzinfo
199
+
200
+ class Дата:
201
+ def __init__(экземпляр, *ПА, **ИА):
202
+ if len(ПА) > 0 and type(ПА[0]) == datetime.date: экземпляр._дата = ПА[0]
203
+ else:
204
+ ИА = __Общие_функции__.Заменить_ключи_в_словаре(
205
+ ИА, Словарь_параметров
206
+ )
207
+ экземпляр._дата = datetime.date(*ПА, **ИА)
208
+
209
+ @staticmethod
210
+ def Сегодня():
211
+ return Дата(datetime.date.today())
212
+
213
+ @staticmethod
214
+ def От_даты(порядковый_номер):
215
+ return Дата(datetime.date.fromordinal(порядковый_номер))
216
+
217
+ def В_формат(экземпляр, формат):
218
+ формат = Перевести_формат(формат)
219
+ return экземпляр._дата.strftime(формат)
220
+
221
+ def __str__(экземпляр):
222
+ формат = Перевести_формат(Формат_даты)
223
+ return экземпляр._дата.strftime(формат)
224
+
225
+ def Из_строки(строка):
226
+ return Дата(Дата_и_время.Разобрать(строка, Формат_времени)._дата_время.date())
227
+
228
+ def День_недели(экземпляр):
229
+ return экземпляр._дата.isoweekday()
230
+
231
+ def Добавить(экземпляр, интервал):
232
+ return Дата(экземпляр._дата + интервал._интервал)
233
+
234
+ def Вычесть(экземпляр, интервал):
235
+ return Дата(экземпляр._дата - интервал._интервал)
236
+
237
+ def __add__(экземпляр, другой):
238
+ if isinstance(другой, Интервал):
239
+ return экземпляр.Добавить(другой)
240
+ return NotImplemented
241
+
242
+ def __radd__(экземпляр, другой):
243
+ if isinstance(другой, Интервал):
244
+ return экземпляр.Добавить(другой)
245
+ return NotImplemented
246
+
247
+ def __sub__(экземпляр, другой):
248
+ if isinstance(другой, Интервал):
249
+ return экземпляр.Вычесть(другой)
250
+ return NotImplemented
251
+
252
+ def __eq__(экземпляр, другой):
253
+ if isinstance(другой, Дата):
254
+ return экземпляр._дата == другой._дата
255
+ return NotImplemented
256
+
257
+ def __lt__(экземпляр, другой):
258
+ if isinstance(другой, Дата):
259
+ return экземпляр._дата < другой._дата
260
+ return NotImplemented
261
+
262
+ def __le__(экземпляр, другой):
263
+ if isinstance(другой, Дата):
264
+ return экземпляр._дата <= другой._дата
265
+ return NotImplemented
266
+
267
+ def __gt__(экземпляр, другой):
268
+ if isinstance(другой, Дата):
269
+ return экземпляр._дата > другой._дата
270
+ return NotImplemented
271
+
272
+ def __ge__(экземпляр, другой):
273
+ if isinstance(другой, Дата):
274
+ return экземпляр._дата >= другой._дата
275
+ return NotImplemented
276
+
277
+ def __format__(экземпляр, формат):
278
+ return экземпляр.В_формат(формат)
279
+
280
+ @property
281
+ def год(экземпляр): return экземпляр._дата.year
282
+
283
+ @property
284
+ def месяц(экземпляр): return экземпляр._дата.month
285
+
286
+ @property
287
+ def день(экземпляр): return экземпляр._дата.day
288
+
289
+ class Время:
290
+ def __init__(экземпляр, *ПА, **ИА):
291
+ ИА = __Общие_функции__.Заменить_ключи_в_словаре(
292
+ ИА, Словарь_параметров
293
+ )
294
+ экземпляр._время = datetime.time(*ПА, **ИА)
295
+
296
+ @staticmethod
297
+ def Сейчас(часовой_пояс=None):
298
+ return Время(datetime.datetime.now(часовой_пояс).time())
299
+
300
+ def В_формат(экземпляр, формат):
301
+ формат = Перевести_формат(формат)
302
+ return экземпляр._время.strftime(формат)
303
+
304
+ def __str__(экземпляр):
305
+ формат = Перевести_формат(Формат_времени)
306
+ return экземпляр._время.strftime(формат)
307
+
308
+ def Заменить(экземпляр, **ИА):
309
+ ИА = __Общие_функции__.Заменить_ключи_в_словаре(
310
+ ИА, Словарь_параметров
311
+ )
312
+ return Время(экземпляр._время.replace(**ИА))
313
+
314
+ def Добавить(экземпляр, интервал):
315
+ базовая_дата = datetime.datetime(1970, 1, 1, экземпляр._время.hour, экземпляр._время.minute, экземпляр._время.second, экземпляр._время.microsecond, экземпляр._время.tzinfo)
316
+ результат = базовая_дата + интервал._интервал
317
+ return Время(результат.hour, результат.minute, результат.second, результат.microsecond, экземпляр._время.tzinfo)
318
+
319
+ def Вычесть(экземпляр, интервал):
320
+ базовая_дата = datetime.datetime(1970, 1, 1, экземпляр._время.hour, экземпляр._время.minute, экземпляр._время.second, экземпляр._время.microsecond, экземпляр._время.tzinfo)
321
+ результат = базовая_дата - интервал._интервал
322
+ return Время(результат.hour, результат.minute, результат.second, результат.microsecond, экземпляр._время.tzinfo)
323
+
324
+ def __add__(экземпляр, другой):
325
+ if isinstance(другой, Интервал):
326
+ return экземпляр.Добавить(другой)
327
+ return NotImplemented
328
+
329
+ def __radd__(экземпляр, другой):
330
+ if isinstance(другой, Интервал):
331
+ return экземпляр.Добавить(другой)
332
+ return NotImplemented
333
+
334
+ def __sub__(экземпляр, другой):
335
+ if isinstance(другой, Интервал):
336
+ return экземпляр.Вычесть(другой)
337
+ return NotImplemented
338
+
339
+ def __eq__(экземпляр, другой):
340
+ if isinstance(другой, Время):
341
+ return экземпляр._время == другой._время
342
+ return NotImplemented
343
+
344
+ def __lt__(экземпляр, другой):
345
+ if isinstance(другой, Время):
346
+ return экземпляр._время < другой._время
347
+ return NotImplemented
348
+
349
+ def __le__(экземпляр, другой):
350
+ if isinstance(другой, Время):
351
+ return экземпляр._время <= другой._время
352
+ return NotImplemented
353
+
354
+ def __gt__(экземпляр, другой):
355
+ if isinstance(другой, Время):
356
+ return экземпляр._время > другой._время
357
+ return NotImplemented
358
+
359
+ def __ge__(экземпляр, другой):
360
+ if isinstance(другой, Время):
361
+ return экземпляр._время >= другой._время
362
+ return NotImplemented
363
+
364
+ def __format__(экземпляр, формат):
365
+ return экземпляр.В_формат(формат)
366
+
367
+ @property
368
+ def Часов(экземпляр):
369
+ return экземпляр._время.hour
370
+
371
+ @property
372
+ def Минут(экземпляр):
373
+ return экземпляр._время.minute
374
+
375
+ @property
376
+ def Секунд(экземпляр):
377
+ return экземпляр._время.second
378
+
379
+ @property
380
+ def Микросекунд(экземпляр):
381
+ return экземпляр._время.microsecond
382
+
383
+ @property
384
+ def Часовой_пояс(экземпляр):
385
+ return экземпляр._время.tzinfo
386
+
387
+ class Интервал:
388
+ def __init__(экземпляр, *ПА, **ИА):
389
+ if len(ПА) > 0 and type(ПА[0]) == datetime.timedelta: экземпляр._интервал = ПА[0]
390
+ else:
391
+ ИА = __Общие_функции__.Заменить_ключи_в_словаре(
392
+ ИА, Словарь_параметров_интервала
393
+ )
394
+ экземпляр._интервал = datetime.timedelta(*ПА, **ИА)
395
+
396
+ def Добавить(экземпляр, другой):
397
+ return Интервал(дней=(экземпляр._интервал + другой._интервал).days, секунд=(экземпляр._интервал + другой._интервал).seconds, микросекунд=(экземпляр._интервал + другой._интервал).microseconds)
398
+
399
+ def Вычесть(экземпляр, другой):
400
+ return Интервал(дней=(экземпляр._интервал - другой._интервал).days, секунд=(экземпляр._интервал - другой._интервал).seconds, микросекунд=(экземпляр._интервал - другой._интервал).microseconds)
401
+
402
+ def __str__(экземпляр):
403
+ части = []
404
+ if экземпляр.Дней:
405
+ части.append(Склонение_после_числительного(экземпляр.Дней, ['день', 'дня', 'дней']))
406
+ секунд = экземпляр.Секунд
407
+ if секунд >= 3600:
408
+ часов = секунд // 3600
409
+ части.append(Склонение_после_числительного(часов, ['час', 'часа', 'часов']))
410
+ секунд %= 3600
411
+ if секунд >= 60:
412
+ минут = секунд // 60
413
+ части.append(Склонение_после_числительного(минут, ['минута', 'минуты', 'минут']))
414
+ секунд %= 60
415
+ if секунд:
416
+ части.append(Склонение_после_числительного(секунд, ['секунда', 'секунды', 'секунд']))
417
+ return ' '.join(части) or '0 секунд'
418
+
419
+ @staticmethod
420
+ def Из_строки(строка):
421
+ части = строка.split()
422
+ ИА = {}
423
+ i = 0
424
+ while i < len(части):
425
+ число = int(части[i])
426
+ единица = части[i + 1]
427
+ if 'день' in единица or 'дня' in единица or 'дней' in единица:
428
+ ИА['дней'] = число
429
+ elif 'час' in единица:
430
+ ИА['часов'] = число
431
+ elif 'минут' in единица:
432
+ ИА['минут'] = число
433
+ elif 'секунд' in единица:
434
+ ИА['секунд'] = число
435
+ i += 2
436
+ return Интервал(**ИА)
437
+
438
+ def __add__(экземпляр, другой):
439
+ if isinstance(другой, Интервал):
440
+ return экземпляр.Добавить(другой)
441
+ return NotImplemented
442
+
443
+ def __sub__(экземпляр, другой):
444
+ if isinstance(другой, Интервал):
445
+ return экземпляр.Вычесть(другой)
446
+ return NotImplemented
447
+
448
+ def __eq__(экземпляр, другой):
449
+ if isinstance(другой, Интервал):
450
+ return экземпляр._интервал == другой._интервал
451
+ return NotImplemented
452
+
453
+ def __lt__(экземпляр, другой):
454
+ if isinstance(другой, Интервал):
455
+ return экземпляр._интервал < другой._интервал
456
+ return NotImplemented
457
+
458
+ def __le__(экземпляр, другой):
459
+ if isinstance(другой, Интервал):
460
+ return экземпляр._интервал <= другой._интервал
461
+ return NotImplemented
462
+
463
+ def __gt__(экземпляр, другой):
464
+ if isinstance(другой, Интервал):
465
+ return экземпляр._интервал > другой._интервал
466
+ return NotImplemented
467
+
468
+ def __ge__(экземпляр, другой):
469
+ if isinstance(другой, Интервал):
470
+ return экземпляр._интервал >= другой._интервал
471
+ return NotImplemented
472
+
473
+ @property
474
+ def Дней(экземпляр):
475
+ return экземпляр._интервал.days
476
+
477
+ @property
478
+ def Секунд(экземпляр):
479
+ return экземпляр._интервал.seconds
480
+
481
+ @property
482
+ def Микросекунд(экземпляр):
483
+ return экземпляр._интервал.microseconds
484
+
485
+ @property
486
+ def Всего_секунд(экземпляр):
487
+ return экземпляр._интервал.total_seconds()
488
+
489
+ def Совместить(дата, время):
490
+ return Дата_и_время(datetime.datetime.combine(дата._дата, время._время))
491
+
492
+ class ДатаСтСт:
493
+ def __init__(экземпляр, *ПА):
494
+ if len(ПА) == 3:
495
+ экземпляр.год, экземпляр.месяц, экземпляр.день = ПА
496
+ экземпляр._Посчитать_дни()
497
+ else:
498
+ if isinstance(ПА[0], ДатаСтСт):
499
+ экземпляр.в_днях = ПА[0].в_днях
500
+ else:
501
+ экземпляр.в_днях = ПА[0]
502
+ экземпляр._Посчитать_дату()
503
+
504
+ def _Посчитать_день_недели_и_года(экземпляр):
505
+ экземпляр.день_недели = (экземпляр.в_днях - 1) % 7
506
+ if экземпляр.день_недели == 0: экземпляр.день_недели = 7
507
+ экземпляр.день_года = (
508
+ (275 * экземпляр.месяц // 9)
509
+ - (((экземпляр.месяц + 9) // 12) * (1 + ((экземпляр.год - 4 * (экземпляр.год // 4) + 2) // 3)))
510
+ + экземпляр.день
511
+ - 31
512
+ )
513
+
514
+ def _Посчитать_дни(экземпляр):
515
+ экземпляр.в_днях = (
516
+ 367 * экземпляр.год
517
+ - int((7 * (экземпляр.год + 5001 + int((экземпляр.месяц - 9) / 7))) / 4)
518
+ + int((275 * экземпляр.месяц) / 9)
519
+ + экземпляр.день
520
+ + 8353
521
+ )
522
+ экземпляр._Посчитать_день_недели_и_года()
523
+
524
+ def _Посчитать_дату(экземпляр):
525
+ a = экземпляр.в_днях + 1890
526
+ b = int((a - 122.1) / 365.25)
527
+ c = int(365.25 * b)
528
+ d = int((a - c) / 30.6001)
529
+ экземпляр.день = a - c - int(30.6001 * d)
530
+ экземпляр.месяц = d - (13 if d > 13 else 1)
531
+ экземпляр.год = b - (3 if экземпляр.месяц < 3 else 4)
532
+ экземпляр._Посчитать_день_недели_и_года()
533
+
534
+ def Добавить_дни(экземпляр, количество):
535
+ экземпляр.в_днях += количество
536
+ экземпляр._Посчитать_дату()
537
+ return экземпляр
538
+
539
+ def Разница_в_днях(экземпляр, другая_дата):
540
+ return экземпляр.в_днях - другая_дата.в_днях
541
+
542
+ def Сравнить(экземпляр, другая_дата):
543
+ if экземпляр.в_днях < другая_дата.в_днях: return -1
544
+ elif экземпляр.в_днях > другая_дата.в_днях: return 1
545
+ else: return 0
546
+
547
+ def В_новый_стиль(экземпляр):
548
+ разница = экземпляр.год // 100 - экземпляр.год // 400 - 2
549
+ год_увеличения_разницы = экземпляр.год % 100 == 0 and экземпляр.год % 400 != 0
550
+ if год_увеличения_разницы:
551
+ if экземпляр.день_года < 60: разница -= 1
552
+ if экземпляр.день_года == 59 and год_увеличения_разницы:
553
+ дата = Дата(экземпляр.год, 3, 1) + Интервал(дней = разница)
554
+ else:
555
+ дата = Дата(экземпляр.год, экземпляр.месяц, экземпляр.день)
556
+ дата += Интервал(дней = разница)
557
+ return дата
558
+
559
+ def Пасха(год, нов_ст = None):
560
+ смещ = (смещ := (год % 19 * 19 + 15) % 30) + (год % 4 * 2 + 4 * год + 6 * смещ + 6) % 7
561
+ нов_ст = True if нов_ст is None and год >= 1918 else нов_ст
562
+ дата = ДатаСтСт(год, 3, 22)
563
+ дата.Добавить_дни(смещ)
564
+ if нов_ст: return дата.В_новый_стиль()
565
+ else: return дата