lyrpy 2024.0.4__py3-none-any.whl → 2025.0.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.

Potentially problematic release.


This version of lyrpy might be problematic. Click here for more details.

Files changed (149) hide show
  1. SRC/LIB/__init__.py +21 -0
  2. SRC/LIB/lyrpy/LUConst.py +358 -0
  3. {lyrpy → SRC/LIB/lyrpy}/LUDateTime.py +2 -4
  4. {lyrpy → SRC/LIB/lyrpy}/LUDecotators.py +2 -3
  5. {lyrpy → SRC/LIB/lyrpy}/LUDict.py +0 -1
  6. {lyrpy → SRC/LIB/lyrpy}/LUDoc.py +4 -3
  7. {lyrpy → SRC/LIB/lyrpy}/LUErrors.py +0 -1
  8. {lyrpy → SRC/LIB/lyrpy}/LUFile.py +115 -61
  9. {lyrpy → SRC/LIB/lyrpy}/LUFileUtils.py +60 -45
  10. {lyrpy → SRC/LIB/lyrpy}/LULog.py +267 -191
  11. {lyrpy → SRC/LIB/lyrpy}/LUObjects.py +4 -4
  12. {lyrpy → SRC/LIB/lyrpy}/LUObjectsYT.py +39 -22
  13. {lyrpy → SRC/LIB/lyrpy}/LUParserARG.py +2 -3
  14. {lyrpy → SRC/LIB/lyrpy}/LUParserINI.py +8 -3
  15. {lyrpy → SRC/LIB/lyrpy}/LUParserREG.py +5 -1
  16. {lyrpy → SRC/LIB/lyrpy}/LUQThread.py +6 -4
  17. {lyrpy → SRC/LIB/lyrpy}/LUQTimer.py +5 -5
  18. {lyrpy → SRC/LIB/lyrpy}/LUSheduler.py +24 -23
  19. SRC/LIB/lyrpy/LUTelegram.py +428 -0
  20. {lyrpy → SRC/LIB/lyrpy}/LUThread.py +7 -6
  21. {lyrpy → SRC/LIB/lyrpy}/LUTimer.py +5 -3
  22. {lyrpy → SRC/LIB/lyrpy}/LUVersion.py +4 -1
  23. {lyrpy → SRC/LIB/lyrpy}/LUYouTube.py +6 -7
  24. {lyrpy → SRC/LIB/lyrpy}/LUos.py +13 -3
  25. SRC/LIB/lyrpy/__init__.py +21 -0
  26. {lyrpy → SRC/LIB/lyrpy}/__main__.py +20 -19
  27. SRC/__init__.py +0 -0
  28. SRC/lyrpy/LUConsole.py +402 -0
  29. SRC/lyrpy/LUConst.py +358 -0
  30. SRC/lyrpy/LUDateTime.py +205 -0
  31. SRC/lyrpy/LUDecotators.py +417 -0
  32. SRC/lyrpy/LUDict.py +116 -0
  33. SRC/lyrpy/LUDoc.py +62 -0
  34. SRC/lyrpy/LUErrors.py +79 -0
  35. SRC/lyrpy/LUFile.py +1228 -0
  36. SRC/lyrpy/LUFileUtils.py +501 -0
  37. SRC/lyrpy/LULog.py +2324 -0
  38. SRC/lyrpy/LUNetwork.py +277 -0
  39. SRC/lyrpy/LUNumUtils.py +305 -0
  40. SRC/lyrpy/LUObjects.py +208 -0
  41. SRC/lyrpy/LUObjectsYT.py +846 -0
  42. SRC/lyrpy/LUParserARG.py +364 -0
  43. SRC/lyrpy/LUParserINI.py +376 -0
  44. SRC/lyrpy/LUParserREG.py +514 -0
  45. SRC/lyrpy/LUProc.py +110 -0
  46. SRC/lyrpy/LUQThread.py +141 -0
  47. SRC/lyrpy/LUQTimer.py +197 -0
  48. SRC/lyrpy/LUSheduler.py +941 -0
  49. SRC/lyrpy/LUStrDecode.py +223 -0
  50. SRC/lyrpy/LUStrUtils.py +633 -0
  51. SRC/lyrpy/LUSupport.py +124 -0
  52. SRC/lyrpy/LUTelegram.py +428 -0
  53. SRC/lyrpy/LUThread.py +177 -0
  54. SRC/lyrpy/LUTimer.py +141 -0
  55. SRC/lyrpy/LUVersion.py +383 -0
  56. SRC/lyrpy/LUYouTube.py +203 -0
  57. SRC/lyrpy/LUos.py +807 -0
  58. lyrpy/LUConst.py → SRC/lyrpy/LUsys.py +12 -10
  59. SRC/lyrpy/__init__.py +21 -0
  60. lyrpy/__init__.py → SRC/lyrpy/__main__.py +2 -3
  61. TESTS/__init__.py +0 -0
  62. TESTS/test_lyrpy.py +4 -0
  63. TESTS/test_main.py +10 -0
  64. __SRC/LIB/__init__.py +0 -0
  65. __SRC/LIB/lyrpy/LUConsole.py +402 -0
  66. __SRC/LIB/lyrpy/LUConst.py +358 -0
  67. __SRC/LIB/lyrpy/LUDateTime.py +205 -0
  68. __SRC/LIB/lyrpy/LUDecotators.py +417 -0
  69. __SRC/LIB/lyrpy/LUDict.py +116 -0
  70. __SRC/LIB/lyrpy/LUDoc.py +62 -0
  71. __SRC/LIB/lyrpy/LUErrors.py +79 -0
  72. __SRC/LIB/lyrpy/LUFile.py +1228 -0
  73. __SRC/LIB/lyrpy/LUFileUtils.py +501 -0
  74. __SRC/LIB/lyrpy/LULog.py +2324 -0
  75. __SRC/LIB/lyrpy/LUNetwork.py +277 -0
  76. __SRC/LIB/lyrpy/LUNumUtils.py +305 -0
  77. __SRC/LIB/lyrpy/LUObjects.py +208 -0
  78. __SRC/LIB/lyrpy/LUObjectsYT.py +846 -0
  79. __SRC/LIB/lyrpy/LUParserARG.py +364 -0
  80. __SRC/LIB/lyrpy/LUParserINI.py +376 -0
  81. __SRC/LIB/lyrpy/LUParserREG.py +514 -0
  82. __SRC/LIB/lyrpy/LUProc.py +110 -0
  83. __SRC/LIB/lyrpy/LUQThread.py +141 -0
  84. __SRC/LIB/lyrpy/LUQTimer.py +197 -0
  85. __SRC/LIB/lyrpy/LUSheduler.py +941 -0
  86. __SRC/LIB/lyrpy/LUStrDecode.py +223 -0
  87. __SRC/LIB/lyrpy/LUStrUtils.py +633 -0
  88. __SRC/LIB/lyrpy/LUSupport.py +124 -0
  89. __SRC/LIB/lyrpy/LUTelegram.py +428 -0
  90. __SRC/LIB/lyrpy/LUThread.py +177 -0
  91. __SRC/LIB/lyrpy/LUTimer.py +141 -0
  92. __SRC/LIB/lyrpy/LUVersion.py +383 -0
  93. __SRC/LIB/lyrpy/LUYouTube.py +203 -0
  94. __SRC/LIB/lyrpy/LUos.py +807 -0
  95. __SRC/LIB/lyrpy/LUsys.py +47 -0
  96. __SRC/LIB/lyrpy/__init__.py +21 -0
  97. __SRC/LIB/lyrpy/__main__.py +20 -0
  98. __SRC/__init__.py +0 -0
  99. ____src/__init__.py +0 -0
  100. ____src/lyrpy/LUConsole.py +402 -0
  101. ____src/lyrpy/LUConst.py +358 -0
  102. ____src/lyrpy/LUDateTime.py +205 -0
  103. ____src/lyrpy/LUDecotators.py +417 -0
  104. ____src/lyrpy/LUDict.py +116 -0
  105. ____src/lyrpy/LUDoc.py +62 -0
  106. ____src/lyrpy/LUErrors.py +79 -0
  107. ____src/lyrpy/LUFile.py +1228 -0
  108. ____src/lyrpy/LUFileUtils.py +501 -0
  109. ____src/lyrpy/LULog.py +2324 -0
  110. ____src/lyrpy/LUNetwork.py +277 -0
  111. ____src/lyrpy/LUNumUtils.py +305 -0
  112. ____src/lyrpy/LUObjects.py +208 -0
  113. ____src/lyrpy/LUObjectsYT.py +846 -0
  114. ____src/lyrpy/LUParserARG.py +364 -0
  115. ____src/lyrpy/LUParserINI.py +376 -0
  116. ____src/lyrpy/LUParserREG.py +514 -0
  117. ____src/lyrpy/LUProc.py +110 -0
  118. ____src/lyrpy/LUQThread.py +141 -0
  119. ____src/lyrpy/LUQTimer.py +197 -0
  120. ____src/lyrpy/LUSheduler.py +941 -0
  121. ____src/lyrpy/LUStrDecode.py +223 -0
  122. ____src/lyrpy/LUStrUtils.py +633 -0
  123. ____src/lyrpy/LUSupport.py +124 -0
  124. ____src/lyrpy/LUTelegram.py +428 -0
  125. ____src/lyrpy/LUThread.py +177 -0
  126. ____src/lyrpy/LUTimer.py +141 -0
  127. ____src/lyrpy/LUVersion.py +383 -0
  128. ____src/lyrpy/LUYouTube.py +203 -0
  129. ____src/lyrpy/LUos.py +807 -0
  130. ____src/lyrpy/LUsys.py +47 -0
  131. ____src/lyrpy/__init__.py +21 -0
  132. ____src/lyrpy/__main__.py +20 -0
  133. lyrpy-2025.0.2.dist-info/METADATA +21 -0
  134. lyrpy-2025.0.2.dist-info/RECORD +145 -0
  135. {lyrpy-2024.0.4.dist-info → lyrpy-2025.0.2.dist-info}/WHEEL +1 -1
  136. lyrpy-2025.0.2.dist-info/top_level.txt +2 -0
  137. lyrpy-2024.0.4.data/data/data/text.txt +0 -1
  138. lyrpy-2024.0.4.dist-info/METADATA +0 -44
  139. lyrpy-2024.0.4.dist-info/RECORD +0 -38
  140. lyrpy-2024.0.4.dist-info/top_level.txt +0 -1
  141. {lyrpy → SRC/LIB/lyrpy}/LUConsole.py +0 -0
  142. {lyrpy → SRC/LIB/lyrpy}/LUNetwork.py +0 -0
  143. {lyrpy → SRC/LIB/lyrpy}/LUNumUtils.py +0 -0
  144. {lyrpy → SRC/LIB/lyrpy}/LUProc.py +0 -0
  145. {lyrpy → SRC/LIB/lyrpy}/LUStrDecode.py +0 -0
  146. {lyrpy → SRC/LIB/lyrpy}/LUStrUtils.py +0 -0
  147. {lyrpy → SRC/LIB/lyrpy}/LUSupport.py +0 -0
  148. {lyrpy → SRC/LIB/lyrpy}/LUsys.py +0 -0
  149. {lyrpy-2024.0.4.dist-info → lyrpy-2025.0.2.dist-info/licenses}/LICENSE +0 -0
@@ -0,0 +1,364 @@
1
+ """LUParserARG.py"""
2
+ # -*- coding: UTF-8 -*-
3
+ __annotations__ = """
4
+ =======================================================
5
+ Copyright (c) 2023-2024
6
+ Author:
7
+ Lisitsin Y.R.
8
+ Project:
9
+ LU_PY
10
+ Python (LU)
11
+ Module:
12
+ LUParserARG.py
13
+
14
+ =======================================================
15
+ """
16
+
17
+ #------------------------------------------
18
+ # БИБЛИОТЕКИ python
19
+ #------------------------------------------
20
+ import sys
21
+ import argparse
22
+
23
+ # re - Regular expression operations
24
+ import re
25
+
26
+ #------------------------------------------
27
+ # БИБЛИОТЕКИ сторонние
28
+ #------------------------------------------
29
+
30
+ #------------------------------------------
31
+ # БИБЛИОТЕКА LU
32
+ #------------------------------------------
33
+ import lyrpy.LULog as LULog
34
+
35
+ #------------------------------------------
36
+ # Разбор аргументов
37
+ #------------------------------------------
38
+ cSwitchChars = ('-', '/')
39
+
40
+ class TArgParser (argparse.ArgumentParser):
41
+ """TArgParser"""
42
+ luClassName = 'TArgParser'
43
+
44
+ #--------------------------------------------------
45
+ # constructor
46
+ #--------------------------------------------------
47
+ def __init__ (self, **kwargs):
48
+ """ Constructor """
49
+ #beginfunction
50
+ super ().__init__ (**kwargs)
51
+ self.__FArgs: argparse.Namespace = None
52
+ self.__FArgsUnknown: argparse.Namespace = None
53
+ self.__FArgsDICT = {}
54
+ ...
55
+ #endfunction
56
+
57
+ #--------------------------------------------------
58
+ # destructor
59
+ #--------------------------------------------------
60
+ def __del__ (self):
61
+ """ destructor """
62
+ #beginfunction
63
+ LClassName = self.__class__.__name__
64
+ s = '{} уничтожен'.format (LClassName)
65
+ # LULog.LoggerTOOLS_AddLevel (LULog.DEBUGTEXT, s)
66
+ #print (s)
67
+ #endfunction
68
+
69
+ #--------------------------------------------------
70
+ # @property ArgParser
71
+ #--------------------------------------------------
72
+ # getter
73
+ @property
74
+ def ArgParser(self):
75
+ #beginfunction
76
+ return self
77
+ #endfunction
78
+
79
+ #--------------------------------------------------
80
+ # @property ArgsDICT
81
+ #--------------------------------------------------
82
+ @property
83
+ # getter
84
+ def ArgsDICT (self):
85
+ #beginfunction
86
+ return self.__FArgsDICT
87
+ #endfunction
88
+ @ArgsDICT.setter
89
+ def ArgsDICT (self, Value):
90
+ #beginfunction
91
+ self.__FArgsDICT = Value
92
+ #endfunction
93
+
94
+ #--------------------------------------------------
95
+ # @property Args
96
+ #--------------------------------------------------
97
+ @property
98
+ # getter
99
+ def Args (self) -> argparse.Namespace:
100
+ #beginfunction
101
+ return self.__FArgs
102
+ #endfunction
103
+ @Args.setter
104
+ def Args (self, Value: argparse.Namespace):
105
+ #beginfunction
106
+ self.__FArgs = Value
107
+ #endfunction
108
+
109
+ #--------------------------------------------------
110
+ # @property ArgsUnknown
111
+ #--------------------------------------------------
112
+ @property
113
+ # getter
114
+ def ArgsUnknown (self) -> argparse.Namespace:
115
+ #beginfunction
116
+ return self.__FArgsUnknown
117
+ #endfunction
118
+ @ArgsUnknown.setter
119
+ def ArgsUnknown (self, Value: argparse.Namespace):
120
+ #beginfunction
121
+ self.__FArgsUnknown = Value
122
+ #endfunction
123
+
124
+ def Clear (self):
125
+ #beginfunction
126
+ ...
127
+ #endfunction
128
+
129
+ def ReadARGS (self, AARGS: dict):
130
+
131
+ def GetARG (AARGName, AARGValue):
132
+ #beginfunction
133
+ LResult = AARGS.get (AARGName).get (AARGValue)
134
+ # try:
135
+ # LResult = AARGS [AARGName] [AARGValue]
136
+ # except:
137
+ # LResult = None
138
+ # #endtry
139
+ return LResult
140
+ #endfunction
141
+
142
+ #beginfunction
143
+ for name, value in AARGS.items ():
144
+ # s = f"{name}={value}"
145
+ #print (s)
146
+ LArg = self.add_argument (GetARG (name, 'name'),
147
+ dest = GetARG (name, 'dest'),
148
+ type = GetARG (name, 'type'),
149
+ default = GetARG (name, 'default'),
150
+ help = GetARG (name, 'help'),
151
+ action = GetARG (name, 'action'),
152
+ choices = GetARG (name, 'choices')
153
+ )
154
+ #endfor
155
+
156
+ # GArgParser.Args = GArgParser.ArgParser.parse_args (['-ld', '1'], namespace = C)
157
+
158
+ # self.Args = self.ArgParser.parse_args ()
159
+ self.Args, self.ArgsUnknown = self.parse_known_args ()
160
+ #print (self.Args)
161
+
162
+ self.ArgsDICT = vars (self.Args)
163
+ #print (self.ArgsDICT)
164
+
165
+ # for item in self.Args:
166
+ # ...
167
+ # GArgParser.ArgsDICT = {'-ld': GArgParser.Args.ld, '-lf': GArgParser.Args.lf,
168
+ # '-lfj': GArgParser.Args.lfj, '-ini': GArgParser.Args.ini}
169
+
170
+ #endfunction
171
+ #endclass
172
+
173
+ """
174
+ --------------------------------------
175
+ ArgumentParser objects
176
+ --------------------------------------
177
+ class argparse.ArgumentParser(prog=None, usage=None, description=None,
178
+ epilog=None, parents=[], formatter_class=argparse.HelpFormatter,
179
+ prefix_chars='-', fromfile_prefix_chars=None, argument_default=None,
180
+ conflict_handler='error', add_help=True, allow_abbrev=True, exit_on_error=True)
181
+
182
+ prog - имя программы (по умолчанию: os.path.basename(sys.argv[0]))
183
+ usage - Строка, описывающая использование программы (по умолчанию: генерируется из аргументов, добавленных в парсер)
184
+ description - текст для отображения перед аргументом help (по умолчанию без текста)
185
+ epilog - текст для отображения после справки аргумента (по умолчанию без текста)
186
+ parents - список объектов ArgumentParser, чьи аргументы также должны быть включены
187
+ formatter_class - класс для настройки вывода справки
188
+ prefix_chars - набор символов, которые предшествуют необязательным аргументам (по умолчанию: «-»).
189
+ fromfile_prefix_chars - набор символов, которые префиксируют файлы,
190
+ из которых должны быть прочитаны дополнительные аргументы (по умолчанию: нет)
191
+ argument_default - глобальное значение по умолчанию для аргументов (по умолчанию: None)
192
+ conflict_handler - стратегия разрешения конфликтующих опций (обычно ненужных)
193
+ add_help - добавить параметр -h/--help в парсер (по умолчанию: True)
194
+ allow_abbrev - позволяет сокращать длинные параметры, если аббревиатура недвусмысленна. (по умолчанию: Истина)
195
+ exit_on_error - определяет, завершается ли ArgumentParser с информацией об ошибке при возникновении ошибки.
196
+ (по умолчанию: Истина)
197
+ """
198
+
199
+ """
200
+ --------------------------------------
201
+ The add_argument() method
202
+ ArgumentParser.add_argument(name or flags...[, action][, nargs]
203
+ [, const][, default][, type][, choices][, required][, help][, metavar][, dest])
204
+ --------------------------------------
205
+ name or flags - либо имя, либо список строк параметров, например. foo или -f, --foo.
206
+ action - основной тип действия, которое необходимо предпринять, когда этот аргумент встречается в командной строке.
207
+ 'store', 'store_const', 'store_true', 'append', 'append_const', 'count', 'help', 'version'
208
+ nargs - количество аргументов командной строки, которые следует использовать.
209
+ int, '?', '*', '+', or argparse.REMAINDER
210
+ const - постоянное значение, необходимое для выбора некоторых действий и nargs.
211
+ default - значение, создаваемое, если аргумент отсутствует в командной строке и если он
212
+ отсутствует в объекте пространства имен. Defaults to None.
213
+ type - Тип, в который должен быть преобразован аргумент командной строки.
214
+ int, float, argparse.FileType('w'), or callable function
215
+ choices - последовательность допустимых значений аргумента.
216
+ ['foo', 'bar'], range(1, 10), or Container instance
217
+ required - можно ли опустить параметр командной строки (только необязательные параметры).
218
+ True or False
219
+ help - Краткое описание того, что делает аргумент.
220
+ metavar - имя аргумента в сообщениях об использовании.
221
+ dest - имя атрибута, который будет добавлен к объекту, возвращаемому функцией parse_args().
222
+
223
+ LArg = GArgParser.add_argument (
224
+ '-ld', dest='ld',
225
+ type=str, default='',
226
+ help = 'log dir',
227
+
228
+ action='store', required=True,
229
+ # action='store_const', const=True
230
+ # action='store_true',
231
+ # action='store_false',
232
+
233
+ nargs = '+',
234
+ # nargs = '?', const='',
235
+
236
+ # choices=[],
237
+ metavar = 'LDM'
238
+ )
239
+ """
240
+
241
+ """
242
+ --------------------------------------
243
+ The parse_args() method
244
+ --------------------------------------
245
+ ArgumentParser.parse_args(args=None, namespace=None)
246
+ args - Список строк для разбора. Значение по умолчанию берется из sys.argv.
247
+ namespace - Объект для получения атрибутов. По умолчанию используется новый пустой объект пространства имен.
248
+ ----------------------------------
249
+ """
250
+
251
+ #------------------------------------------------------
252
+ """ Работа со параметрами программы """
253
+ #------------------------------------------------------
254
+
255
+ #------------------------------------------------------
256
+ # __GetCmdLineArg
257
+ #------------------------------------------------------
258
+ def __GetCmdLineArg (ASwitch: str, ASwitchChars: (), AIgnoreCase: bool) -> str:
259
+ """__GetCmdLineArg"""
260
+ #beginfunction
261
+ i = 0
262
+ for s in sys.argv:
263
+ i = i + 1
264
+ if len(ASwitchChars) == 0 or ((s[0] in ASwitchChars) and (len(s) > 1)):
265
+ s = re.split('|'.join(ASwitchChars), s)[1]
266
+ if AIgnoreCase:
267
+ if s.upper() == ASwitch.upper():
268
+ if i < len(sys.argv):
269
+ s = sys.argv[i]
270
+ if s[0] in ASwitchChars:
271
+ return ''
272
+ else:
273
+ return s
274
+ #endif
275
+ #endif
276
+ #endif
277
+ else:
278
+ if s == ASwitch:
279
+ i = i + 1
280
+ if i <= len(sys.argv):
281
+ s = sys.argv[i]
282
+ if s[0] in ASwitchChars:
283
+ return ''
284
+ else:
285
+ return s
286
+ #endif
287
+ #endif
288
+ #endif
289
+ #endif
290
+ #endfor
291
+ return ''
292
+ #endfunction
293
+
294
+ #------------------------------------------------------
295
+ # FindCmdLineSwitch
296
+ #------------------------------------------------------
297
+ def FindCmdLineSwitch (ASwitch: str, ASwitchChars: (), AIgnoreCase: bool) -> bool:
298
+ """FindCmdLineSwitch"""
299
+ #beginfunction
300
+ i = 0
301
+ for s in sys.argv:
302
+ i = i + 1
303
+ if len(ASwitchChars) == 0 or ((s[0] in ASwitchChars) and (len(s) > 1)):
304
+ s = re.split('|'.join(ASwitchChars), s)[1]
305
+ if AIgnoreCase:
306
+ if s.upper() == ASwitch.upper():
307
+ return True
308
+ #endif
309
+ else:
310
+ if s == ASwitch:
311
+ return True
312
+ #endif
313
+ #endif
314
+ #endif
315
+ #endfor
316
+ return False
317
+ #endfunction
318
+
319
+ #---------------------------------------------------------
320
+ # GetParam
321
+ #---------------------------------------------------------
322
+ def GetParam (AParamName: str, ADefaultValue: str) -> str:
323
+ """GetParam"""
324
+ #beginfunction
325
+ LResult = ADefaultValue
326
+ if FindCmdLineSwitch (AParamName, cSwitchChars, True):
327
+ LParamValue: str = __GetCmdLineArg (AParamName, cSwitchChars, True)
328
+ LResult = LParamValue
329
+ #endif
330
+ return LResult
331
+ #endfunction
332
+
333
+ #---------------------------------------------------------
334
+ # CreateTArgParser
335
+ #---------------------------------------------------------
336
+ def CreateTArgParser (AProg: str, ADescrption: str) -> TArgParser:
337
+ """CreateTArgParser"""
338
+ #beginfunction
339
+ LResult = TArgParser (prog = AProg, description=ADescrption, prefix_chars='-/',
340
+ usage = None, epilog = None, parents = [], formatter_class = argparse.HelpFormatter,
341
+ fromfile_prefix_chars = None, argument_default = None,
342
+ conflict_handler = 'error', add_help = True)
343
+ return LResult
344
+ #endfunction
345
+
346
+ GArgParser = CreateTArgParser ('LUArgParser', 'Параметры')
347
+
348
+ #---------------------------------------------------------
349
+ # main
350
+ #---------------------------------------------------------
351
+ def main ():
352
+ #beginfunction
353
+ ...
354
+ #endfunction
355
+
356
+ #------------------------------------------
357
+ #
358
+ #------------------------------------------
359
+ #beginmodule
360
+ if __name__ == "__main__":
361
+ main()
362
+ #endif
363
+
364
+ #endmodule