paramflow 0.3.2__tar.gz → 0.4__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.
- {paramflow-0.3.2/paramflow.egg-info → paramflow-0.4}/PKG-INFO +1 -1
- paramflow-0.4/paramflow/__pycache__/convert.cpython-313.pyc +0 -0
- {paramflow-0.3.2 → paramflow-0.4}/paramflow/__pycache__/frozen.cpython-313.pyc +0 -0
- {paramflow-0.3.2 → paramflow-0.4}/paramflow/__pycache__/params.cpython-313.pyc +0 -0
- paramflow-0.4/paramflow/__pycache__/parser.cpython-313.pyc +0 -0
- {paramflow-0.3.2 → paramflow-0.4}/paramflow/convert.py +15 -0
- {paramflow-0.3.2 → paramflow-0.4}/paramflow/frozen.py +6 -6
- {paramflow-0.3.2 → paramflow-0.4}/paramflow/params.py +5 -4
- {paramflow-0.3.2 → paramflow-0.4}/paramflow/parser.py +15 -2
- {paramflow-0.3.2 → paramflow-0.4/paramflow.egg-info}/PKG-INFO +1 -1
- {paramflow-0.3.2 → paramflow-0.4}/setup.py +1 -1
- paramflow-0.3.2/paramflow/__pycache__/convert.cpython-313.pyc +0 -0
- paramflow-0.3.2/paramflow/__pycache__/parser.cpython-313.pyc +0 -0
- {paramflow-0.3.2 → paramflow-0.4}/LICENSE +0 -0
- {paramflow-0.3.2 → paramflow-0.4}/MANIFEST.in +0 -0
- {paramflow-0.3.2 → paramflow-0.4}/README.md +0 -0
- {paramflow-0.3.2 → paramflow-0.4}/paramflow/__init__.py +0 -0
- {paramflow-0.3.2 → paramflow-0.4}/paramflow/__pycache__/__init__.cpython-312.pyc +0 -0
- {paramflow-0.3.2 → paramflow-0.4}/paramflow/__pycache__/__init__.cpython-313.pyc +0 -0
- {paramflow-0.3.2 → paramflow-0.4}/paramflow/__pycache__/convert.cpython-312.pyc +0 -0
- {paramflow-0.3.2 → paramflow-0.4}/paramflow/__pycache__/frozen.cpython-312.pyc +0 -0
- {paramflow-0.3.2 → paramflow-0.4}/paramflow/__pycache__/frozen_test.cpython-312-pytest-8.3.4.pyc +0 -0
- {paramflow-0.3.2 → paramflow-0.4}/paramflow/__pycache__/params.cpython-312.pyc +0 -0
- {paramflow-0.3.2 → paramflow-0.4}/paramflow/__pycache__/params_test.cpython-312-pytest-8.3.4.pyc +0 -0
- {paramflow-0.3.2 → paramflow-0.4}/paramflow/__pycache__/parser.cpython-312.pyc +0 -0
- {paramflow-0.3.2 → paramflow-0.4}/paramflow.egg-info/SOURCES.txt +0 -0
- {paramflow-0.3.2 → paramflow-0.4}/paramflow.egg-info/dependency_links.txt +0 -0
- {paramflow-0.3.2 → paramflow-0.4}/paramflow.egg-info/requires.txt +0 -0
- {paramflow-0.3.2 → paramflow-0.4}/paramflow.egg-info/top_level.txt +0 -0
- {paramflow-0.3.2 → paramflow-0.4}/pyproject.toml +0 -0
- {paramflow-0.3.2 → paramflow-0.4}/setup.cfg +0 -0
|
Binary file
|
|
Binary file
|
|
Binary file
|
|
Binary file
|
|
@@ -33,3 +33,18 @@ def convert_type(dst_value, src_value, path=''):
|
|
|
33
33
|
if path != '':
|
|
34
34
|
path += ' '
|
|
35
35
|
raise TypeError(f'unable to convert {path}{src_type} to {dst_type}') from e
|
|
36
|
+
|
|
37
|
+
|
|
38
|
+
def infer_type(value: str):
|
|
39
|
+
result = value
|
|
40
|
+
if '.' in value:
|
|
41
|
+
try:
|
|
42
|
+
result = float(value)
|
|
43
|
+
except ValueError:
|
|
44
|
+
pass
|
|
45
|
+
else:
|
|
46
|
+
try:
|
|
47
|
+
result = int(value)
|
|
48
|
+
except ValueError:
|
|
49
|
+
pass
|
|
50
|
+
return result
|
|
@@ -1,7 +1,7 @@
|
|
|
1
1
|
from typing import Union, List, Dict
|
|
2
2
|
|
|
3
3
|
|
|
4
|
-
class
|
|
4
|
+
class ParamsDict(dict):
|
|
5
5
|
|
|
6
6
|
def __init__(self, *args, **kwargs):
|
|
7
7
|
super().__init__(*args, **kwargs)
|
|
@@ -20,7 +20,7 @@ class FrozenAttrDict(dict):
|
|
|
20
20
|
raise TypeError('FrozenAttrDict is immutable')
|
|
21
21
|
|
|
22
22
|
|
|
23
|
-
class
|
|
23
|
+
class ParamsList(list):
|
|
24
24
|
|
|
25
25
|
def __setitem__(self, index, value):
|
|
26
26
|
raise TypeError('FrozenList is immutable')
|
|
@@ -53,7 +53,7 @@ class FrozenList(list):
|
|
|
53
53
|
raise TypeError('FrozenList is immutable')
|
|
54
54
|
|
|
55
55
|
|
|
56
|
-
def freeze(params: Union[List[any], Dict[str, any]]) -> Union[
|
|
56
|
+
def freeze(params: Union[List[any], Dict[str, any]]) -> Union[ParamsList[any], ParamsDict[str, any]]:
|
|
57
57
|
"""
|
|
58
58
|
Recursively freeze dictionaries and list making them read-only. Frozen dict profides attribute-style access.
|
|
59
59
|
:param params: parameters as python dict and list tree
|
|
@@ -63,16 +63,16 @@ def freeze(params: Union[List[any], Dict[str, any]]) -> Union[FrozenList[any], F
|
|
|
63
63
|
for key, value in params.items():
|
|
64
64
|
if isinstance(value, dict) or isinstance(value, list):
|
|
65
65
|
params[key] = freeze(value)
|
|
66
|
-
return
|
|
66
|
+
return ParamsDict(params)
|
|
67
67
|
elif isinstance(params, list):
|
|
68
68
|
for i in range(len(params)):
|
|
69
69
|
value = params[i]
|
|
70
70
|
if isinstance(value, dict) or isinstance(value, list):
|
|
71
71
|
params[i] = freeze(value)
|
|
72
|
-
return
|
|
72
|
+
return ParamsList(params)
|
|
73
73
|
|
|
74
74
|
|
|
75
|
-
def unfreeze(params: Union[
|
|
75
|
+
def unfreeze(params: Union[ParamsList[any], ParamsDict[str, any]]) -> Union[List[any], Dict[str, any]]:
|
|
76
76
|
"""
|
|
77
77
|
Recursively unfreeze tree of frozen dicts and lists.
|
|
78
78
|
Useful for serialization, where deserialization of immutable dict or list may fail.
|
|
@@ -5,7 +5,7 @@ from functools import reduce
|
|
|
5
5
|
from typing import List, Dict, Optional, Union, Final, Type, Tuple
|
|
6
6
|
|
|
7
7
|
from paramflow.convert import convert_type
|
|
8
|
-
from paramflow.frozen import freeze,
|
|
8
|
+
from paramflow.frozen import freeze, ParamsDict
|
|
9
9
|
from paramflow.parser import PARSER_MAP, EnvParser, ArgsParser, DotEnvParser, Parser
|
|
10
10
|
|
|
11
11
|
ENV_SOURCE: Final[str] = 'env'
|
|
@@ -19,11 +19,11 @@ def load(*sources: Tuple[str, ...],
|
|
|
19
19
|
args_prefix: str = '',
|
|
20
20
|
profile_key: str = 'profile',
|
|
21
21
|
default_profile: str = 'default',
|
|
22
|
-
profile: Optional[str] = None) ->
|
|
22
|
+
profile: Optional[str] = None) -> ParamsDict[str, any]:
|
|
23
23
|
"""
|
|
24
24
|
Load parameters form multiple sources, layer them on top of each other and activate profile.
|
|
25
25
|
Activation of profile means learying it on top of the default profile.
|
|
26
|
-
:param
|
|
26
|
+
:param sources: file or multiple files to load parameters from
|
|
27
27
|
:param meta_env_prefix: prefix for env vars that are used to overwrite meta params
|
|
28
28
|
:param meta_args_prefix: prefix for command-line arguments to overwrite meta params
|
|
29
29
|
:param env_prefix: prefix for env vars that are used to overwrite params, if None disable auto adding env source
|
|
@@ -44,7 +44,8 @@ def load(*sources: Tuple[str, ...],
|
|
|
44
44
|
'__source__': ['pf.load'],
|
|
45
45
|
}
|
|
46
46
|
meta_env_parser = EnvParser(meta_env_prefix, 'default')
|
|
47
|
-
meta_args_parser = ArgsParser(meta_args_prefix, 'default',
|
|
47
|
+
meta_args_parser = ArgsParser(meta_args_prefix, 'default',
|
|
48
|
+
no_exit=True, consume_args=True, descr='Meta-parameters')
|
|
48
49
|
meta = deep_merge(meta, meta_env_parser(meta))
|
|
49
50
|
meta = deep_merge(meta, meta_args_parser(meta))
|
|
50
51
|
meta = freeze(meta)
|
|
@@ -2,11 +2,14 @@ import argparse
|
|
|
2
2
|
import configparser
|
|
3
3
|
import json
|
|
4
4
|
import os
|
|
5
|
+
import sys
|
|
5
6
|
from abc import ABC, abstractmethod
|
|
6
7
|
from typing import Dict, Final, Type
|
|
7
8
|
|
|
8
9
|
import yaml
|
|
9
10
|
|
|
11
|
+
from paramflow.convert import infer_type
|
|
12
|
+
|
|
10
13
|
|
|
11
14
|
class Parser(ABC):
|
|
12
15
|
@abstractmethod
|
|
@@ -131,12 +134,13 @@ class NoExitArgumentParser(argparse.ArgumentParser):
|
|
|
131
134
|
class ArgsParser(Parser):
|
|
132
135
|
|
|
133
136
|
def __init__(self, prefix: str, default_profile: str, target_profile: str = None,
|
|
134
|
-
no_exit: bool = False, descr: str = None):
|
|
137
|
+
no_exit: bool = False, descr: str = None, consume_args: bool = False):
|
|
135
138
|
self.prefix = prefix
|
|
136
139
|
self.default_profile = default_profile
|
|
137
140
|
self.target_profile = target_profile
|
|
138
141
|
self.no_exit = no_exit
|
|
139
142
|
self.descr = descr
|
|
143
|
+
self.consume_args = consume_args
|
|
140
144
|
|
|
141
145
|
def __call__(self, params: Dict[str, any]) -> Dict[str, any]:
|
|
142
146
|
if self.target_profile is None and self.default_profile in params:
|
|
@@ -151,12 +155,21 @@ class ArgsParser(Parser):
|
|
|
151
155
|
if typ is dict or typ is list or typ is bool or typ is tuple or value is None:
|
|
152
156
|
typ = str
|
|
153
157
|
parser.add_argument(f'--{self.prefix}{key}', type=typ, default=None, help=f'{key} = {value}')
|
|
154
|
-
args,
|
|
158
|
+
args, remaining = parser.parse_known_args()
|
|
155
159
|
args_params = {}
|
|
156
160
|
for arg_key, arg_value in args.__dict__.items():
|
|
157
161
|
if arg_value is not None:
|
|
158
162
|
key = arg_key.replace(self.prefix, '')
|
|
159
163
|
args_params[key] = arg_value
|
|
164
|
+
|
|
165
|
+
if self.consume_args:
|
|
166
|
+
sys.argv = [sys.argv[0]] + remaining
|
|
167
|
+
else:
|
|
168
|
+
it = iter(remaining)
|
|
169
|
+
for arg_name, arg_value in zip(it, it):
|
|
170
|
+
key = arg_name.replace('--', '').replace(self.prefix, '')
|
|
171
|
+
args_params[key] = infer_type(arg_value)
|
|
172
|
+
|
|
160
173
|
result = args_params
|
|
161
174
|
if len(args_params) > 0:
|
|
162
175
|
if self.target_profile is not None:
|
|
Binary file
|
|
Binary file
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
{paramflow-0.3.2 → paramflow-0.4}/paramflow/__pycache__/frozen_test.cpython-312-pytest-8.3.4.pyc
RENAMED
|
File without changes
|
|
File without changes
|
{paramflow-0.3.2 → paramflow-0.4}/paramflow/__pycache__/params_test.cpython-312-pytest-8.3.4.pyc
RENAMED
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|