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.
Files changed (31) hide show
  1. {paramflow-0.3.2/paramflow.egg-info → paramflow-0.4}/PKG-INFO +1 -1
  2. paramflow-0.4/paramflow/__pycache__/convert.cpython-313.pyc +0 -0
  3. {paramflow-0.3.2 → paramflow-0.4}/paramflow/__pycache__/frozen.cpython-313.pyc +0 -0
  4. {paramflow-0.3.2 → paramflow-0.4}/paramflow/__pycache__/params.cpython-313.pyc +0 -0
  5. paramflow-0.4/paramflow/__pycache__/parser.cpython-313.pyc +0 -0
  6. {paramflow-0.3.2 → paramflow-0.4}/paramflow/convert.py +15 -0
  7. {paramflow-0.3.2 → paramflow-0.4}/paramflow/frozen.py +6 -6
  8. {paramflow-0.3.2 → paramflow-0.4}/paramflow/params.py +5 -4
  9. {paramflow-0.3.2 → paramflow-0.4}/paramflow/parser.py +15 -2
  10. {paramflow-0.3.2 → paramflow-0.4/paramflow.egg-info}/PKG-INFO +1 -1
  11. {paramflow-0.3.2 → paramflow-0.4}/setup.py +1 -1
  12. paramflow-0.3.2/paramflow/__pycache__/convert.cpython-313.pyc +0 -0
  13. paramflow-0.3.2/paramflow/__pycache__/parser.cpython-313.pyc +0 -0
  14. {paramflow-0.3.2 → paramflow-0.4}/LICENSE +0 -0
  15. {paramflow-0.3.2 → paramflow-0.4}/MANIFEST.in +0 -0
  16. {paramflow-0.3.2 → paramflow-0.4}/README.md +0 -0
  17. {paramflow-0.3.2 → paramflow-0.4}/paramflow/__init__.py +0 -0
  18. {paramflow-0.3.2 → paramflow-0.4}/paramflow/__pycache__/__init__.cpython-312.pyc +0 -0
  19. {paramflow-0.3.2 → paramflow-0.4}/paramflow/__pycache__/__init__.cpython-313.pyc +0 -0
  20. {paramflow-0.3.2 → paramflow-0.4}/paramflow/__pycache__/convert.cpython-312.pyc +0 -0
  21. {paramflow-0.3.2 → paramflow-0.4}/paramflow/__pycache__/frozen.cpython-312.pyc +0 -0
  22. {paramflow-0.3.2 → paramflow-0.4}/paramflow/__pycache__/frozen_test.cpython-312-pytest-8.3.4.pyc +0 -0
  23. {paramflow-0.3.2 → paramflow-0.4}/paramflow/__pycache__/params.cpython-312.pyc +0 -0
  24. {paramflow-0.3.2 → paramflow-0.4}/paramflow/__pycache__/params_test.cpython-312-pytest-8.3.4.pyc +0 -0
  25. {paramflow-0.3.2 → paramflow-0.4}/paramflow/__pycache__/parser.cpython-312.pyc +0 -0
  26. {paramflow-0.3.2 → paramflow-0.4}/paramflow.egg-info/SOURCES.txt +0 -0
  27. {paramflow-0.3.2 → paramflow-0.4}/paramflow.egg-info/dependency_links.txt +0 -0
  28. {paramflow-0.3.2 → paramflow-0.4}/paramflow.egg-info/requires.txt +0 -0
  29. {paramflow-0.3.2 → paramflow-0.4}/paramflow.egg-info/top_level.txt +0 -0
  30. {paramflow-0.3.2 → paramflow-0.4}/pyproject.toml +0 -0
  31. {paramflow-0.3.2 → paramflow-0.4}/setup.cfg +0 -0
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.4
2
2
  Name: paramflow
3
- Version: 0.3.2
3
+ Version: 0.4
4
4
  Summary: A lightweight library for hyperparameter and configuration management
5
5
  Home-page: https://github.com/mduszyk/paramflow
6
6
  Classifier: Programming Language :: Python :: 3
@@ -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 FrozenAttrDict(dict):
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 FrozenList(list):
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[FrozenList[any], FrozenAttrDict[str, any]]:
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 FrozenAttrDict(params)
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 FrozenList(params)
72
+ return ParamsList(params)
73
73
 
74
74
 
75
- def unfreeze(params: Union[FrozenList[any], FrozenAttrDict[str, any]]) -> Union[List[any], Dict[str, any]]:
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, FrozenAttrDict
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) -> FrozenAttrDict[str, any]:
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 source: file or multiple files to load parameters from
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', no_exit=True, descr='Meta-parameters')
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, _ = parser.parse_known_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:
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.4
2
2
  Name: paramflow
3
- Version: 0.3.2
3
+ Version: 0.4
4
4
  Summary: A lightweight library for hyperparameter and configuration management
5
5
  Home-page: https://github.com/mduszyk/paramflow
6
6
  Classifier: Programming Language :: Python :: 3
@@ -2,7 +2,7 @@ from setuptools import setup, find_packages
2
2
 
3
3
  setup(
4
4
  name='paramflow',
5
- version='0.3.2',
5
+ version='0.4',
6
6
  description='A lightweight library for hyperparameter and configuration management',
7
7
  packages=find_packages(),
8
8
  install_requires=[
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes