rupython 1.4.12__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.
- {rupython-1.4.12 → rupython-1.4.13}/PKG-INFO +1 -1
- {rupython-1.4.12 → 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 +1 -1
- {rupython-1.4.12 → rupython-1.4.13}/rupython//320/234/320/276/320/264/321/203/320/273/320/270//320/221/320/224.py +6 -6
- 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
- {rupython-1.4.12 → 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
- {rupython-1.4.12 → 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
- {rupython-1.4.12 → 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
- {rupython-1.4.12 → rupython-1.4.13}/rupython.egg-info/PKG-INFO +1 -1
- {rupython-1.4.12 → rupython-1.4.13}/setup.py +1 -1
- rupython-1.4.12/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
- {rupython-1.4.12 → rupython-1.4.13}/LICENSE +0 -0
- {rupython-1.4.12 → rupython-1.4.13}/README.md +0 -0
- {rupython-1.4.12 → rupython-1.4.13}/rupython/__main__.py +0 -0
- {rupython-1.4.12 → 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
- {rupython-1.4.12 → 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
- {rupython-1.4.12 → 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
- {rupython-1.4.12 → 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
- {rupython-1.4.12 → 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
- {rupython-1.4.12 → 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
- {rupython-1.4.12 → 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
- {rupython-1.4.12 → 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
- {rupython-1.4.12 → 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
- {rupython-1.4.12 → rupython-1.4.13}/rupython.egg-info/SOURCES.txt +0 -0
- {rupython-1.4.12 → rupython-1.4.13}/rupython.egg-info/dependency_links.txt +0 -0
- {rupython-1.4.12 → rupython-1.4.13}/rupython.egg-info/top_level.txt +0 -0
- {rupython-1.4.12 → rupython-1.4.13}/setup.cfg +0 -0
|
@@ -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': 'Число_вхождений',
|
|
@@ -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 дата
|
|
@@ -1,22 +1,32 @@
|
|
|
1
1
|
import os
|
|
2
2
|
import sys
|
|
3
3
|
|
|
4
|
+
# --- Системная информация ---
|
|
4
5
|
Аргументы_запуска = sys.argv
|
|
5
6
|
Пути_модулей = sys.path
|
|
7
|
+
Модули = sys.modules
|
|
6
8
|
Платформа = sys.platform
|
|
7
9
|
Версия_языка = sys.version
|
|
10
|
+
Порядок_байтов = 'МлСт' if sys.byteorder == 'little' else 'СтМл'
|
|
11
|
+
Интерпретатор = sys.executable
|
|
8
12
|
|
|
13
|
+
# --- Потоки ввода-вывода ---
|
|
9
14
|
Поток_ввода = sys.stdin
|
|
10
15
|
Поток_вывода = sys.stdout
|
|
11
16
|
Поток_ошибок = sys.stderr
|
|
12
17
|
|
|
18
|
+
# --- Окружение и ОС ---
|
|
13
19
|
Название_ОС = os.name
|
|
14
20
|
Окружение = os.environ
|
|
21
|
+
Разделитель_пути = os.sep
|
|
22
|
+
Разделитель_строк = os.linesep
|
|
15
23
|
|
|
16
24
|
def Завершить_работу(код_ошибки = 0): sys.exit(код_ошибки)
|
|
17
25
|
def Размер_в_памяти(объект): return sys.getsizeof(объект)
|
|
18
26
|
def Выполнить_команду(команда): return os.system(команда)
|
|
27
|
+
def Идентификатор_процесса(): return os.getpid()
|
|
19
28
|
def Случайные_байты(длина): return os.urandom(длина)
|
|
20
29
|
|
|
30
|
+
# --- Специфичное для Windows ---
|
|
21
31
|
if Название_ОС == 'nt':
|
|
22
32
|
def Запустить_файл(путь): os.startfile(путь)
|