master > master: code py - vereinheitlicht mit go projekt
This commit is contained in:
parent
f0d0c9ef8a
commit
6bf15f936e
@ -5,9 +5,10 @@
|
|||||||
# IMPORTS
|
# IMPORTS
|
||||||
# ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
|
# ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
|
||||||
|
|
||||||
import functools;
|
import functools
|
||||||
|
|
||||||
from src.core.log import *;
|
from src.core.log import *;
|
||||||
|
from src.setup import appconfig;
|
||||||
from src.core.metrics import *;
|
from src.core.metrics import *;
|
||||||
from src.setup.display import *;
|
from src.setup.display import *;
|
||||||
|
|
||||||
@ -38,8 +39,6 @@ nonnestedAlgorithms = OneShot();
|
|||||||
|
|
||||||
def algorithmInfos(
|
def algorithmInfos(
|
||||||
name: str,
|
name: str,
|
||||||
checks: bool = True,
|
|
||||||
metrics: bool = None,
|
|
||||||
outputnames: List[str] = ['result'],
|
outputnames: List[str] = ['result'],
|
||||||
preChecks: Any = None,
|
preChecks: Any = None,
|
||||||
postChecks: Any = None
|
postChecks: Any = None
|
||||||
@ -67,7 +66,7 @@ def algorithmInfos(
|
|||||||
# Initialisierung
|
# Initialisierung
|
||||||
DisplayStartOfAlgorithm(name, **inputs);
|
DisplayStartOfAlgorithm(name, **inputs);
|
||||||
# Prechecks
|
# Prechecks
|
||||||
if checks and callable(preChecks):
|
if appconfig.AppConfigPerformChecks() and callable(preChecks):
|
||||||
preChecks(**inputs);
|
preChecks(**inputs);
|
||||||
# Metriken initialisieren + starten
|
# Metriken initialisieren + starten
|
||||||
ResetMetrics();
|
ResetMetrics();
|
||||||
@ -85,11 +84,11 @@ def algorithmInfos(
|
|||||||
outputs_ = outputs if isinstance(outputs, tuple) else tuple([outputs]);
|
outputs_ = outputs if isinstance(outputs, tuple) else tuple([outputs]);
|
||||||
outputsNamed = { outputnames[k]: value for k, value in enumerate(outputs_) };
|
outputsNamed = { outputnames[k]: value for k, value in enumerate(outputs_) };
|
||||||
# Letzte Messages
|
# Letzte Messages
|
||||||
if metrics:
|
if appconfig.AppConfigShowMetrics():
|
||||||
DisplayMetrics();
|
DisplayMetrics();
|
||||||
DisplayEndOfAlgorithm(**outputsNamed);
|
DisplayEndOfAlgorithm(**outputsNamed);
|
||||||
# Postchecks
|
# Postchecks
|
||||||
if checks and callable(postChecks):
|
if appconfig.AppConfigPerformChecks() and callable(postChecks):
|
||||||
postChecks(**inputs, **outputsNamed);
|
postChecks(**inputs, **outputsNamed);
|
||||||
except Exception as e:
|
except Exception as e:
|
||||||
nonnestedAlgorithms.state = state1;
|
nonnestedAlgorithms.state = state1;
|
||||||
|
@ -37,7 +37,7 @@ def postChecks(L: List[int], x: int, index: int, **_):
|
|||||||
# ALGORITHM binary search
|
# ALGORITHM binary search
|
||||||
# ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
|
# ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
|
||||||
|
|
||||||
@algorithmInfos(name='Binärsuchalgorithmus', outputnames=['index'], checks=True, metrics=True, preChecks=preChecks, postChecks=postChecks)
|
@algorithmInfos(name='Binärsuchalgorithmus', outputnames=['index'], preChecks=preChecks, postChecks=postChecks)
|
||||||
def BinarySearch(L: List[int], x: int) -> int:
|
def BinarySearch(L: List[int], x: int) -> int:
|
||||||
'''
|
'''
|
||||||
Inputs: L = Liste von Zahlen, x = Zahl.
|
Inputs: L = Liste von Zahlen, x = Zahl.
|
||||||
|
@ -37,7 +37,7 @@ def postChecks(L: List[int], x: int, index: int, **_):
|
|||||||
# ALGORITHM interpolation
|
# ALGORITHM interpolation
|
||||||
# ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
|
# ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
|
||||||
|
|
||||||
@algorithmInfos(name='Interpolationssuchalgorithmus', outputnames=['index'], checks=True, metrics=True, preChecks=preChecks, postChecks=postChecks)
|
@algorithmInfos(name='Interpolationssuchalgorithmus', outputnames=['index'], preChecks=preChecks, postChecks=postChecks)
|
||||||
def InterpolationSearch(L: List[int], x: int, u: int, v: int) -> int:
|
def InterpolationSearch(L: List[int], x: int, u: int, v: int) -> int:
|
||||||
'''
|
'''
|
||||||
Inputs: L = Liste von Zahlen, x = Zahl, [u, v] = Suchinterval.
|
Inputs: L = Liste von Zahlen, x = Zahl, [u, v] = Suchinterval.
|
||||||
|
@ -36,7 +36,7 @@ def postChecks(L: List[int], i: int, value: int, **_):
|
|||||||
# ALGORITHM find ith smallest element
|
# ALGORITHM find ith smallest element
|
||||||
# ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
|
# ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
|
||||||
|
|
||||||
@algorithmInfos(name='Auswahlproblem (i. kleinstes Element)', outputnames=['value'], checks=True, metrics=True, preChecks=preChecks, postChecks=postChecks)
|
@algorithmInfos(name='Auswahlproblem (i. kleinstes Element)', outputnames=['value'], preChecks=preChecks, postChecks=postChecks)
|
||||||
def FindIthSmallest(L: List[int], i: int) -> int:
|
def FindIthSmallest(L: List[int], i: int) -> int:
|
||||||
'''
|
'''
|
||||||
Inputs: L = Liste von Zahlen, i = Ordinalzahl
|
Inputs: L = Liste von Zahlen, i = Ordinalzahl
|
||||||
@ -68,7 +68,7 @@ def FindIthSmallest(L: List[int], i: int) -> int:
|
|||||||
# ALGORITHM find ith smallest element (D & C)
|
# ALGORITHM find ith smallest element (D & C)
|
||||||
# ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
|
# ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
|
||||||
|
|
||||||
@algorithmInfos(name='Auswahlproblem (i. kleinstes Element, D & C)', outputnames=['value'], checks=True, metrics=True, preChecks=preChecks, postChecks=postChecks)
|
@algorithmInfos(name='Auswahlproblem (i. kleinstes Element, D & C)', outputnames=['value'], preChecks=preChecks, postChecks=postChecks)
|
||||||
def FindIthSmallestDC(L: List[int], i: int) -> int:
|
def FindIthSmallestDC(L: List[int], i: int) -> int:
|
||||||
'''
|
'''
|
||||||
Inputs: L = Liste von Zahlen, i = Ordinalzahl
|
Inputs: L = Liste von Zahlen, i = Ordinalzahl
|
||||||
|
@ -39,7 +39,7 @@ def postChecks(L: List[int], x: int, index: int, **_):
|
|||||||
# ALGORITHM jump search
|
# ALGORITHM jump search
|
||||||
# ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
|
# ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
|
||||||
|
|
||||||
@algorithmInfos(name='Sprungsuche', outputnames=['index'], checks=True, metrics=True, preChecks=preChecks, postChecks=postChecks)
|
@algorithmInfos(name='Sprungsuche', outputnames=['index'], preChecks=preChecks, postChecks=postChecks)
|
||||||
def JumpSearchLinear(L: List[int], x: int, m: int) -> int:
|
def JumpSearchLinear(L: List[int], x: int, m: int) -> int:
|
||||||
'''
|
'''
|
||||||
Inputs: L = Liste von Zahlen, x = Zahl, m = lineare Sprunggröße.
|
Inputs: L = Liste von Zahlen, x = Zahl, m = lineare Sprunggröße.
|
||||||
@ -71,7 +71,7 @@ def JumpSearchLinear(L: List[int], x: int, m: int) -> int:
|
|||||||
# ALGORITHM jump search - exponentiell
|
# ALGORITHM jump search - exponentiell
|
||||||
# ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
|
# ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
|
||||||
|
|
||||||
@algorithmInfos(name='Sprungsuche (exponentiell)', outputnames=['index'], checks=True, metrics=True, preChecks=preChecks, postChecks=postChecks)
|
@algorithmInfos(name='Sprungsuche (exponentiell)', outputnames=['index'], preChecks=preChecks, postChecks=postChecks)
|
||||||
def JumpSearchExponentiell(L: List[int], x: int) -> int:
|
def JumpSearchExponentiell(L: List[int], x: int) -> int:
|
||||||
'''
|
'''
|
||||||
Inputs: L = Liste von Zahlen, x = Zahl.
|
Inputs: L = Liste von Zahlen, x = Zahl.
|
||||||
|
@ -36,7 +36,7 @@ def postChecks(L: List[int], index: int, **_):
|
|||||||
# ALGORITHM find poison
|
# ALGORITHM find poison
|
||||||
# ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
|
# ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
|
||||||
|
|
||||||
@algorithmInfos(name='Giftsuche (O(n) Vorkoster)', outputnames=['index'], checks=True, metrics=True, preChecks=preChecks, postChecks=postChecks)
|
@algorithmInfos(name='Giftsuche (O(n) Vorkoster)', outputnames=['index'], preChecks=preChecks, postChecks=postChecks)
|
||||||
def FindPoison(L: List[int]) -> int:
|
def FindPoison(L: List[int]) -> int:
|
||||||
'''
|
'''
|
||||||
Inputs: L = Liste von Getränken: durch 0-1 Werte wird dargestellt, ob ein Getränk vergiftet ist.
|
Inputs: L = Liste von Getränken: durch 0-1 Werte wird dargestellt, ob ein Getränk vergiftet ist.
|
||||||
@ -64,7 +64,7 @@ def FindPoison(L: List[int]) -> int:
|
|||||||
# ALGORITHM find poison fast
|
# ALGORITHM find poison fast
|
||||||
# ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
|
# ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
|
||||||
|
|
||||||
@algorithmInfos(name='Giftsuche (O(log(n)) Vorkoster)', outputnames=['index'], checks=True, metrics=True, preChecks=preChecks, postChecks=postChecks)
|
@algorithmInfos(name='Giftsuche (O(log(n)) Vorkoster)', outputnames=['index'], preChecks=preChecks, postChecks=postChecks)
|
||||||
def FindPoisonFast(L: List[int]) -> int:
|
def FindPoisonFast(L: List[int]) -> int:
|
||||||
'''
|
'''
|
||||||
Inputs: L = Liste von Getränken: durch 0-1 Werte wird dargestellt, ob ein Getränk vergiftet ist.
|
Inputs: L = Liste von Getränken: durch 0-1 Werte wird dargestellt, ob ein Getränk vergiftet ist.
|
||||||
|
@ -37,7 +37,7 @@ def postChecks(L: List[int], x: int, index: int, **_):
|
|||||||
# ALGORITHM sequential search
|
# ALGORITHM sequential search
|
||||||
# ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
|
# ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
|
||||||
|
|
||||||
@algorithmInfos(name='Sequenziellsuchalgorithmus', outputnames=['index'], checks=True, metrics=True, preChecks=preChecks, postChecks=postChecks)
|
@algorithmInfos(name='Sequenziellsuchalgorithmus', outputnames=['index'], preChecks=preChecks, postChecks=postChecks)
|
||||||
def SequentialSearch(L: List[int], x: int) -> int:
|
def SequentialSearch(L: List[int], x: int) -> int:
|
||||||
'''
|
'''
|
||||||
Inputs: L = Liste von Zahlen, x = Zahl.
|
Inputs: L = Liste von Zahlen, x = Zahl.
|
||||||
|
@ -33,7 +33,7 @@ def postChecks(L: List[int], **_):
|
|||||||
# ALGORITHM max sub sum
|
# ALGORITHM max sub sum
|
||||||
# ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
|
# ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
|
||||||
|
|
||||||
@algorithmInfos(name='MaxSubSum (Maximale Teilsumme)', outputnames=['maxSum', 'index_from', 'index_to'], checks=True, metrics=True, preChecks=preChecks, postChecks=postChecks)
|
@algorithmInfos(name='MaxSubSum (Maximale Teilsumme)', outputnames=['maxSum', 'index_from', 'index_to'], preChecks=preChecks, postChecks=postChecks)
|
||||||
def MaxSubSum(L: List[float]) -> Tuple[float, int, int]:
|
def MaxSubSum(L: List[float]) -> Tuple[float, int, int]:
|
||||||
'''
|
'''
|
||||||
Inputs: L = Liste von Zahlen
|
Inputs: L = Liste von Zahlen
|
||||||
@ -58,7 +58,7 @@ def MaxSubSum(L: List[float]) -> Tuple[float, int, int]:
|
|||||||
# ALGORITHM max sub sum (D & C)
|
# ALGORITHM max sub sum (D & C)
|
||||||
# ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
|
# ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
|
||||||
|
|
||||||
@algorithmInfos(name='MaxSubSum (Maximale Teilsumme mit D & C)', outputnames=['maxSum', 'index_from', 'index_to'], checks=True, metrics=True, preChecks=preChecks, postChecks=postChecks)
|
@algorithmInfos(name='MaxSubSum (Maximale Teilsumme mit D & C)', outputnames=['maxSum', 'index_from', 'index_to'], preChecks=preChecks, postChecks=postChecks)
|
||||||
def MaxSubSumDC(L: List[float]) -> Tuple[float, int, int]:
|
def MaxSubSumDC(L: List[float]) -> Tuple[float, int, int]:
|
||||||
'''
|
'''
|
||||||
Inputs: L = Liste von Zahlen
|
Inputs: L = Liste von Zahlen
|
||||||
|
@ -10,6 +10,8 @@ from src.local.misc import *;
|
|||||||
from src.local.system import *;
|
from src.local.system import *;
|
||||||
from src.local.typing import *;
|
from src.local.typing import *;
|
||||||
|
|
||||||
|
from src.core.utils import StripAnsi;
|
||||||
|
|
||||||
# ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
|
# ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
|
||||||
# GLOBAL VARIABLES
|
# GLOBAL VARIABLES
|
||||||
# ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
|
# ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
|
||||||
@ -17,6 +19,7 @@ from src.local.typing import *;
|
|||||||
_logging_prefix: str = '';
|
_logging_prefix: str = '';
|
||||||
_quietmode: bool = False;
|
_quietmode: bool = False;
|
||||||
_debugmode: bool = False;
|
_debugmode: bool = False;
|
||||||
|
_ansimode: bool = False;
|
||||||
|
|
||||||
# ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
|
# ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
|
||||||
# METHOD get/set quiet mode, logging depth, timer
|
# METHOD get/set quiet mode, logging depth, timer
|
||||||
@ -38,6 +41,14 @@ def SetDebugMode(mode: bool):
|
|||||||
_debugmode = mode;
|
_debugmode = mode;
|
||||||
return;
|
return;
|
||||||
|
|
||||||
|
def GetAnsiMode() -> bool:
|
||||||
|
return _ansimode;
|
||||||
|
|
||||||
|
def SetAnsiMode(mode: bool):
|
||||||
|
global _ansimode;
|
||||||
|
_ansimode = mode;
|
||||||
|
return;
|
||||||
|
|
||||||
# ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
|
# ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
|
||||||
# Logging
|
# Logging
|
||||||
# ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
|
# ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
|
||||||
@ -48,7 +59,10 @@ def logGeneric(tag: str, *lines: Any, file: io.TextIOWrapper, force: bool = Fals
|
|||||||
tag = '' if tag == '' else tag + ' ';
|
tag = '' if tag == '' else tag + ' ';
|
||||||
file = file or sys.stdout;
|
file = file or sys.stdout;
|
||||||
for line in lines:
|
for line in lines:
|
||||||
print('{}{}{}'.format('', tag, line), file=file);
|
line = '{}{}{}'.format('', tag, line);
|
||||||
|
if not _ansimode:
|
||||||
|
line = StripAnsi(line);
|
||||||
|
print(line, file=file);
|
||||||
if not tag_all:
|
if not tag_all:
|
||||||
tag = '';
|
tag = '';
|
||||||
return;
|
return;
|
||||||
|
40
code/python/src/core/utils.py
Normal file
40
code/python/src/core/utils.py
Normal file
@ -0,0 +1,40 @@
|
|||||||
|
#!/usr/bin/env python3
|
||||||
|
# -*- coding: utf-8 -*-
|
||||||
|
|
||||||
|
# ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
|
||||||
|
# IMPORTS
|
||||||
|
# ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
|
||||||
|
|
||||||
|
import re;
|
||||||
|
from textwrap import dedent;
|
||||||
|
|
||||||
|
# ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
|
||||||
|
# METHODS ansi
|
||||||
|
# ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
|
||||||
|
|
||||||
|
def StripAnsi(text: str) -> str:
|
||||||
|
return re.sub(r'\x1b[^m]*m', '', text);
|
||||||
|
|
||||||
|
# ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
|
||||||
|
# METHODS strings
|
||||||
|
# ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
|
||||||
|
|
||||||
|
def DedentIgnoreFirstLast(text: str) -> str:
|
||||||
|
text = '\n'.join(re.split(r'\n', text)[1:][:-1])
|
||||||
|
return dedent(text);
|
||||||
|
|
||||||
|
# ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
|
||||||
|
# METHODS strings -> bool
|
||||||
|
# ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
|
||||||
|
|
||||||
|
def IsTrue(text: str) -> bool:
|
||||||
|
text = text.strip();
|
||||||
|
if re.match(r'^(true|t|yes|y|1|\+|\+1)$', text, re.IGNORECASE):
|
||||||
|
return True;
|
||||||
|
return False;
|
||||||
|
|
||||||
|
def IsFalse(text: str) -> bool:
|
||||||
|
text = text.strip();
|
||||||
|
if re.match(r'^(false|f|no|n|0|-|-1)$', text, re.IGNORECASE):
|
||||||
|
return True;
|
||||||
|
return False;
|
0
code/python/src/endpoints/__init__.py
Normal file
0
code/python/src/endpoints/__init__.py
Normal file
11
code/python/src/endpoints/exports.py
Normal file
11
code/python/src/endpoints/exports.py
Normal file
@ -0,0 +1,11 @@
|
|||||||
|
#!/usr/bin/env python3
|
||||||
|
# -*- coding: utf-8 -*-
|
||||||
|
|
||||||
|
# ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
|
||||||
|
# EXPORTS
|
||||||
|
# ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
|
||||||
|
|
||||||
|
from src.endpoints.print import version as endpoint_version;
|
||||||
|
from src.endpoints.print import help as endpoint_help;
|
||||||
|
from src.endpoints.run import runInteractive as endpoint_runInteractive;
|
||||||
|
from src.endpoints.run import runNonInteractive as endpoint_runNonInteractive;
|
29
code/python/src/endpoints/print.py
Normal file
29
code/python/src/endpoints/print.py
Normal file
@ -0,0 +1,29 @@
|
|||||||
|
#!/usr/bin/env python3
|
||||||
|
# -*- coding: utf-8 -*-
|
||||||
|
|
||||||
|
# ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
|
||||||
|
# IMPORTS
|
||||||
|
# ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
|
||||||
|
|
||||||
|
from src.core.log import *;
|
||||||
|
from src.setup.cli import GetArgumentsFromCli;
|
||||||
|
from src.setup.cli import GetArgumentParser;
|
||||||
|
|
||||||
|
# ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
|
||||||
|
# ENDPOINT version
|
||||||
|
# ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
|
||||||
|
|
||||||
|
def version():
|
||||||
|
with open('assets/VERSION', 'r') as fp:
|
||||||
|
version = ('\n'.join(fp.readlines())).strip();
|
||||||
|
logPlain(version);
|
||||||
|
return;
|
||||||
|
|
||||||
|
# ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
|
||||||
|
# ENDPOINT help
|
||||||
|
# ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
|
||||||
|
|
||||||
|
def help():
|
||||||
|
parser = GetArgumentParser();
|
||||||
|
parser.print_help();
|
||||||
|
return;
|
69
code/python/src/endpoints/run.py
Normal file
69
code/python/src/endpoints/run.py
Normal file
@ -0,0 +1,69 @@
|
|||||||
|
#!/usr/bin/env python3
|
||||||
|
# -*- coding: utf-8 -*-
|
||||||
|
|
||||||
|
# ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
|
||||||
|
# IMPORTS
|
||||||
|
# ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
|
||||||
|
|
||||||
|
from src.core.log import *;
|
||||||
|
from src.core.config import *;
|
||||||
|
from src.setup.display import *;
|
||||||
|
from src.algorithms.exports import *;
|
||||||
|
|
||||||
|
# ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
|
||||||
|
# ENDPOINT run interactive modus
|
||||||
|
# ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
|
||||||
|
|
||||||
|
def runInteractive():
|
||||||
|
'''
|
||||||
|
Startet Programm im interaktiven Modus (Konsole).
|
||||||
|
'''
|
||||||
|
logWarn('Interaktiver Modus noch nicht implementiert.');
|
||||||
|
return;
|
||||||
|
|
||||||
|
# ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
|
||||||
|
# ENDPOINT run non-interactive
|
||||||
|
# ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
|
||||||
|
|
||||||
|
def runNonInteractive(path: str):
|
||||||
|
'''
|
||||||
|
Liest Fälle aus Configdatei aus und führt Algorithmen darauf aus.
|
||||||
|
'''
|
||||||
|
config = ReadConfigFile(path);
|
||||||
|
cases = GetAttribute(config, 'parts', 'cases', expectedtype=list, default=[]);
|
||||||
|
for caseindex, case in enumerate(cases):
|
||||||
|
command = GetAttribute(case, 'command', expectedtype=str, default='');
|
||||||
|
descr = GetAttribute(case, 'description', expectedtype=str, default='');
|
||||||
|
inputs = GetAttribute(case, 'inputs', expectedtype=dict, default={});
|
||||||
|
|
||||||
|
DisplayStartOfCase(caseindex, descr);
|
||||||
|
|
||||||
|
try:
|
||||||
|
if command == 'algorithm-sum-maxsub':
|
||||||
|
MaxSubSum(L=inputs['L']);
|
||||||
|
elif command == 'algorithm-sum-maxsub-dc':
|
||||||
|
MaxSubSumDC(L=inputs['L']);
|
||||||
|
elif command == 'algorithm-search-sequential':
|
||||||
|
SequentialSearch(L=inputs['L'], x=inputs['x']);
|
||||||
|
elif command == 'algorithm-search-binary':
|
||||||
|
BinarySearch(L=inputs['L'], x=inputs['x']);
|
||||||
|
elif command == 'algorithm-search-interpolation':
|
||||||
|
InterpolationSearch(L=inputs['L'], x=inputs['x'], u=0, v=len(inputs['L'])-1);
|
||||||
|
elif command == 'algorithm-search-jump':
|
||||||
|
JumpSearchLinear(L=inputs['L'], x=inputs['x'], m=inputs['m']);
|
||||||
|
elif command == 'algorithm-search-jump-exp':
|
||||||
|
JumpSearchExponentiell(L=inputs['L'], x=inputs['x']);
|
||||||
|
elif command == 'algorithm-search-ith-element':
|
||||||
|
FindIthSmallest(L=inputs['L'], i=inputs['i']);
|
||||||
|
elif command == 'algorithm-search-ith-element-dc':
|
||||||
|
FindIthSmallestDC(L=inputs['L'], i=inputs['i']);
|
||||||
|
elif command == 'algorithm-search-poison':
|
||||||
|
FindPoison(L=inputs['L']);
|
||||||
|
elif command == 'algorithm-search-poison-fast':
|
||||||
|
FindPoisonFast(L=inputs['L']);
|
||||||
|
else:
|
||||||
|
raise ValueError('Command \033[1m{}\033[0m nicht erkannt'.format(command));
|
||||||
|
except Exception as e:
|
||||||
|
logError(e);
|
||||||
|
DisplayEndOfCase();
|
||||||
|
return;
|
@ -8,80 +8,54 @@
|
|||||||
import os;
|
import os;
|
||||||
import sys;
|
import sys;
|
||||||
|
|
||||||
sys.path.insert(0, os.path.abspath(os.path.join(os.path.abspath(__file__), '..', '..')));
|
_path_to_python_project = os.path.abspath(os.path.join(os.path.abspath(__file__), '..', '..'));
|
||||||
os.chdir(os.path.abspath(os.path.join(os.path.abspath(__file__), '..', '..', '..', '..')));
|
sys.path.insert(0, _path_to_python_project);
|
||||||
|
os.chdir(_path_to_python_project);
|
||||||
|
|
||||||
from src.core.log import *;
|
from src.core.log import *;
|
||||||
from src.core.config import *;
|
from src.core.utils import IsTrue;
|
||||||
from src.setup.display import *;
|
from src.core.utils import IsFalse;
|
||||||
from src.setup.cli import *;
|
from src.setup.cli import *;
|
||||||
from src.algorithms.exports import *;
|
from src.setup import appconfig;
|
||||||
|
from src.endpoints.exports import *;
|
||||||
|
|
||||||
# ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
|
# ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
|
||||||
# GLOBAL VARIABLES/CONSTANTS
|
# GLOBAL VARIABLES/CONSTANTS
|
||||||
# ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
|
# ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
|
||||||
|
|
||||||
PATH_TO_CONFIG: str = 'code/config.yml';
|
PATH_TO_CONFIG: str = '../config.yml';
|
||||||
|
|
||||||
# ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
|
# ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
|
||||||
# MAIN PROCESS
|
# MAIN PROCESS
|
||||||
# ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
|
# ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
|
||||||
|
|
||||||
def enter(quiet: bool, debug: bool, mode: str, path: Any, **_):
|
def enter(
|
||||||
|
mode: str,
|
||||||
|
it: bool,
|
||||||
|
quiet: bool,
|
||||||
|
debug: bool,
|
||||||
|
checks: bool,
|
||||||
|
colour: bool,
|
||||||
|
config: Any, **_
|
||||||
|
):
|
||||||
SetQuietMode(quiet);
|
SetQuietMode(quiet);
|
||||||
SetDebugMode(debug);
|
SetDebugMode(debug);
|
||||||
configpath = path if isinstance(path, str) else PATH_TO_CONFIG;
|
SetAnsiMode(colour);
|
||||||
if mode in 'run':
|
appconfig.SetAppConfigPerformChecks(checks);
|
||||||
LoopThroughCases(path=configpath);
|
|
||||||
else:
|
config = config if isinstance(config, str) else PATH_TO_CONFIG;
|
||||||
DisplayHelpMessage();
|
|
||||||
|
if mode == 'version':
|
||||||
|
endpoint_version();
|
||||||
return;
|
return;
|
||||||
|
elif mode == 'run':
|
||||||
# ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
|
if it:
|
||||||
# SECONDARY PROCESSES
|
endpoint_runInteractive();
|
||||||
# ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
|
|
||||||
|
|
||||||
def LoopThroughCases(path: str):
|
|
||||||
'''
|
|
||||||
Durchlauf aller Testfälle.
|
|
||||||
'''
|
|
||||||
config = ReadConfigFile(path);
|
|
||||||
cases = GetAttribute(config, 'parts', 'cases', expectedtype=list, default=[]);
|
|
||||||
for caseindex, case in enumerate(cases):
|
|
||||||
command = GetAttribute(case, 'command', expectedtype=str, default='');
|
|
||||||
descr = GetAttribute(case, 'description', expectedtype=str, default='');
|
|
||||||
inputs = GetAttribute(case, 'inputs', expectedtype=dict, default={});
|
|
||||||
|
|
||||||
DisplayStartOfCase(caseindex, descr);
|
|
||||||
|
|
||||||
try:
|
|
||||||
if command == 'algorithm-sum-maxsub':
|
|
||||||
MaxSubSum(L=inputs['L']);
|
|
||||||
elif command == 'algorithm-sum-maxsub-dc':
|
|
||||||
MaxSubSumDC(L=inputs['L']);
|
|
||||||
elif command == 'algorithm-search-sequential':
|
|
||||||
SequentialSearch(L=inputs['L'], x=inputs['x']);
|
|
||||||
elif command == 'algorithm-search-binary':
|
|
||||||
BinarySearch(L=inputs['L'], x=inputs['x']);
|
|
||||||
elif command == 'algorithm-search-interpolation':
|
|
||||||
InterpolationSearch(L=inputs['L'], x=inputs['x'], u=0, v=len(inputs['L'])-1);
|
|
||||||
elif command == 'algorithm-search-jump':
|
|
||||||
JumpSearchLinear(L=inputs['L'], x=inputs['x'], m=inputs['m']);
|
|
||||||
elif command == 'algorithm-search-jump-exp':
|
|
||||||
JumpSearchExponentiell(L=inputs['L'], x=inputs['x']);
|
|
||||||
elif command == 'algorithm-search-ith-element':
|
|
||||||
FindIthSmallest(L=inputs['L'], i=inputs['i']);
|
|
||||||
elif command == 'algorithm-search-ith-element-dc':
|
|
||||||
FindIthSmallestDC(L=inputs['L'], i=inputs['i']);
|
|
||||||
elif command == 'algorithm-search-poison':
|
|
||||||
FindPoison(L=inputs['L']);
|
|
||||||
elif command == 'algorithm-search-poison-fast':
|
|
||||||
FindPoisonFast(L=inputs['L']);
|
|
||||||
else:
|
else:
|
||||||
raise ValueError('Command \033[1m{}\033[0m nicht erkannt'.format(command));
|
endpoint_runNonInteractive(path=config);
|
||||||
except Exception as e:
|
else: # elif mode
|
||||||
logError(e);
|
endpoint_help();
|
||||||
DisplayEndOfCase();
|
return;
|
||||||
return;
|
return;
|
||||||
|
|
||||||
# ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
|
# ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
|
||||||
@ -91,7 +65,16 @@ def LoopThroughCases(path: str):
|
|||||||
if __name__ == '__main__':
|
if __name__ == '__main__':
|
||||||
sys.tracebacklimit = 0;
|
sys.tracebacklimit = 0;
|
||||||
try:
|
try:
|
||||||
args = GetArgumentsFromCli(sys.argv[1:]);
|
args = GetArgumentsFromCli(*sys.argv[1:]);
|
||||||
except:
|
except Exception as e:
|
||||||
|
endpoint_help();
|
||||||
exit(1);
|
exit(1);
|
||||||
enter(quiet=args.quiet, debug=args.debug, mode=args.mode[0], path=args.path);
|
enter(
|
||||||
|
mode=args.mode[0],
|
||||||
|
it=args.it,
|
||||||
|
quiet=args.quiet,
|
||||||
|
debug=args.debug,
|
||||||
|
checks=IsTrue(args.checks[0]),
|
||||||
|
colour=IsTrue(args.colour[0]),
|
||||||
|
config=args.config,
|
||||||
|
);
|
||||||
|
66
code/python/src/setup/appconfig.py
Normal file
66
code/python/src/setup/appconfig.py
Normal file
@ -0,0 +1,66 @@
|
|||||||
|
#!/usr/bin/env python3
|
||||||
|
# -*- coding: utf-8 -*-
|
||||||
|
|
||||||
|
# ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
|
||||||
|
# IMPORTS
|
||||||
|
# ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
|
||||||
|
|
||||||
|
from src.local.io import *;
|
||||||
|
from src.local.misc import *;
|
||||||
|
from src.local.system import *;
|
||||||
|
from src.local.typing import *;
|
||||||
|
|
||||||
|
from src.core.config import *;
|
||||||
|
|
||||||
|
# ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
|
||||||
|
# GLOBAL VARIABLES
|
||||||
|
# ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
|
||||||
|
|
||||||
|
_config: Dict[str, bool] = dict(
|
||||||
|
display = True,
|
||||||
|
metrics = True,
|
||||||
|
checks = False,
|
||||||
|
);
|
||||||
|
|
||||||
|
# ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
|
||||||
|
# METHOD getters
|
||||||
|
# ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
|
||||||
|
|
||||||
|
def AppConfigInitialise():
|
||||||
|
'''
|
||||||
|
Extrahiert Inhalte einer YAML Config und parset dies als Struktur
|
||||||
|
'''
|
||||||
|
global _config;
|
||||||
|
config = ReadConfigFile('assets/config.yml');
|
||||||
|
_config['display'] = GetAttribute(config, 'options', 'display', expectedtype=bool, default=True);
|
||||||
|
_config['metrics'] = GetAttribute(config, 'options', 'metrics', expectedtype=bool, default=True);
|
||||||
|
_config['checks'] = GetAttribute(config, 'options', 'checks', expectedtype=bool, default=True);
|
||||||
|
return;
|
||||||
|
|
||||||
|
def AppConfigFancyMode() -> bool:
|
||||||
|
return _config['display'];
|
||||||
|
|
||||||
|
def AppConfigShowMetrics() -> bool:
|
||||||
|
return _config['metrics'];
|
||||||
|
|
||||||
|
def AppConfigPerformChecks() -> bool:
|
||||||
|
return _config['checks'];
|
||||||
|
|
||||||
|
# ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
|
||||||
|
# METHOD setters
|
||||||
|
# ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
|
||||||
|
|
||||||
|
def SetAppConfigFancyMode(mode: bool):
|
||||||
|
global _config;
|
||||||
|
_config['display'] = mode;
|
||||||
|
return;
|
||||||
|
|
||||||
|
def SetAppConfigShowMetrics(mode: bool):
|
||||||
|
global _config;
|
||||||
|
_config['metrics'] = mode;
|
||||||
|
return;
|
||||||
|
|
||||||
|
def SetAppConfigPerformChecks(mode: bool):
|
||||||
|
global _config;
|
||||||
|
_config['checks'] = mode;
|
||||||
|
return;
|
@ -5,9 +5,11 @@
|
|||||||
# IMPORTS
|
# IMPORTS
|
||||||
# ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
|
# ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
|
||||||
|
|
||||||
|
from argparse import ArgumentError
|
||||||
from src.local.typing import *;
|
from src.local.typing import *;
|
||||||
|
|
||||||
from src.core.log import *;
|
from src.core.log import *;
|
||||||
|
from src.core.utils import DedentIgnoreFirstLast;
|
||||||
|
|
||||||
# ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
|
# ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
|
||||||
# GLOBAL VARIABLES
|
# GLOBAL VARIABLES
|
||||||
@ -24,18 +26,34 @@ def GetArgumentParser() -> argparse.ArgumentParser:
|
|||||||
if not isinstance(parser, argparse.ArgumentParser):
|
if not isinstance(parser, argparse.ArgumentParser):
|
||||||
parser = argparse.ArgumentParser(
|
parser = argparse.ArgumentParser(
|
||||||
prog='code/main.py',
|
prog='code/main.py',
|
||||||
description=dedent('''
|
description=DedentIgnoreFirstLast('''
|
||||||
\033[93;1mBeschreibung:\033[0m
|
\033[93;1mBeschreibung:\033[0m
|
||||||
\033[93;2mEin Programm, das verschiedene Algorithmen aus dem Kurs AlgoDat I testet.\033[0m
|
\033[93;2mEin Programm, das verschiedene Algorithmen aus dem Kurs AlgoDat I testet.\033[0m
|
||||||
'''),
|
'''),
|
||||||
formatter_class=argparse.RawTextHelpFormatter,
|
formatter_class=argparse.RawTextHelpFormatter,
|
||||||
);
|
);
|
||||||
parser.add_argument('mode', nargs=1, choices=['run'], help='run = Führt alle Testfälle in der config.yml Datei durch.');
|
parser.add_argument('mode',
|
||||||
parser.add_argument('--path', nargs=1, type=str, help='Pfad zur alternativen Configdatei.');
|
nargs=1,
|
||||||
parser.add_argument('--debug', action='store_true', help='Debugging Messages stummschalten.')
|
choices=['version', 'help', 'run'],
|
||||||
parser.add_argument('-q', '--quiet', action='store_true', help='Alle console-messages bis auf Errors stummschalten.')
|
help=DedentIgnoreFirstLast('''
|
||||||
|
help = Hilfsanleitung anzeigen.
|
||||||
|
version = Version anzeigen.
|
||||||
|
run = Algorithmen ausführen.
|
||||||
|
'''),
|
||||||
|
);
|
||||||
|
parser.add_argument('--it', action='store_true', help='Startet die App im interaktiven Modus.')
|
||||||
|
parser.add_argument('-q', '--quiet', action='store_true', help='Blendet alle Konsole-Messages aus.')
|
||||||
|
parser.add_argument('--debug', action='store_true', help='Blendet die Debugging-Befehle ein.')
|
||||||
|
parser.add_argument('--checks', nargs=1, type=str, default=['False'],
|
||||||
|
help=DedentIgnoreFirstLast('''
|
||||||
|
(bool) Ob vor und nach Ausführung von Algorithmen Checks
|
||||||
|
auf Inputs/Outputs ausgeführt werden sollen.
|
||||||
|
'''),
|
||||||
|
),
|
||||||
|
parser.add_argument('--colour', nargs=1, type=str, default=['False'], help='(bool) Ob Logging färblich angezeigt wird.')
|
||||||
|
parser.add_argument('--config', nargs=1, type=str, help='(string) Pfad zur Configdatei (nur für run Endpunkt).');
|
||||||
return parser;
|
return parser;
|
||||||
|
|
||||||
def GetArgumentsFromCli(cli_args: List[str]) -> argparse.Namespace:
|
def GetArgumentsFromCli(*cli_args: str) -> argparse.Namespace:
|
||||||
parser = GetArgumentParser();
|
parser = GetArgumentParser();
|
||||||
return parser.parse_args(cli_args);
|
return parser.parse_args(cli_args);
|
||||||
|
Loading…
x
Reference in New Issue
Block a user