|
2 | 2 | from typing import OrderedDict |
3 | 3 | except ImportError: |
4 | 4 | from collections import OrderedDict |
| 5 | +from bionetgen.core.utils.logging import BNGLogger |
5 | 6 | from .structs import NetworkParameter, NetworkCompartment, NetworkGroup |
6 | 7 | from .structs import NetworkSpecies, NetworkFunction, NetworkReaction |
7 | 8 | from .structs import NetworkEnergyPattern, NetworkPopulationMap |
|
12 | 13 | except ImportError: |
13 | 14 | from collections import OrderedDict |
14 | 15 |
|
| 16 | +logger = BNGLogger() |
| 17 | + |
15 | 18 |
|
16 | 19 | ###### BLOCK OBJECTS ###### |
17 | 20 | class NetworkBlock: |
@@ -42,6 +45,7 @@ class NetworkBlock: |
42 | 45 | def __init__(self) -> None: |
43 | 46 | self.name = "NetworkBlock" |
44 | 47 | self.comment = (None, None) |
| 48 | + self._changes = OrderedDict() |
45 | 49 | self.items = OrderedDict() |
46 | 50 |
|
47 | 51 | def __str__(self) -> str: |
@@ -87,10 +91,11 @@ def __setattr__(self, name, value) -> None: |
87 | 91 | if name in self.items.keys(): |
88 | 92 | try: |
89 | 93 | new_value = float(value) |
| 94 | + except (TypeError, ValueError): |
| 95 | + self.items[name] = value |
| 96 | + else: |
90 | 97 | changed = True |
91 | 98 | self.items[name] = new_value |
92 | | - except: |
93 | | - self.items[name] = value |
94 | 99 | if changed: |
95 | 100 | self._changes[name] = new_value |
96 | 101 | self.__dict__[name] = new_value |
@@ -129,9 +134,13 @@ def add_item(self, item_tpl) -> None: |
129 | 134 | if isinstance(name, str): |
130 | 135 | try: |
131 | 136 | setattr(self, name, value) |
132 | | - except: |
133 | | - # print("can't set {} to {}".format(name, value)) |
134 | | - pass |
| 137 | + except Exception as exc: |
| 138 | + logger.warning( |
| 139 | + f"Unable to bind attribute {name!r} for the {self.name} block;" |
| 140 | + " the item remains available via block.items. " |
| 141 | + f"Original error: {exc}", |
| 142 | + loc=f"{__file__} : NetworkBlock.add_item()", |
| 143 | + ) |
135 | 144 | # we just added an item to a block, let's assume we need |
136 | 145 | # to recompile if we have a compiled simulator |
137 | 146 | self._recompile = True |
@@ -174,16 +183,20 @@ def __setattr__(self, name, value) -> None: |
174 | 183 | try: |
175 | 184 | # try a new value, we need to make sure |
176 | 185 | # to stop printing out the expression |
177 | | - value = float(value) |
178 | | - if self.items[name]["value"] != value: |
| 186 | + new_value = float(value) |
| 187 | + if self.items[name]["value"] != new_value: |
179 | 188 | changed = True |
180 | | - self.items[name]["value"] = value |
| 189 | + self.items[name]["value"] = new_value |
181 | 190 | self.items[name].write_expr = False |
182 | | - except: |
183 | | - print( |
184 | | - "can't set parameter {} to {}".format( |
185 | | - self.items[name]["name"], value |
186 | | - ) |
| 191 | + value = new_value |
| 192 | + except (TypeError, ValueError): |
| 193 | + logger.warning( |
| 194 | + "Unable to set parameter {!r} to {!r}; keeping existing value {!r}".format( |
| 195 | + self.items[name]["name"], |
| 196 | + value, |
| 197 | + self.items[name]["value"], |
| 198 | + ), |
| 199 | + loc=f"{__file__} : NetworkParameterBlock.__setattr__()", |
187 | 200 | ) |
188 | 201 | if changed: |
189 | 202 | self._changes[name] = value |
@@ -226,15 +239,19 @@ def __setattr__(self, name, value) -> None: |
226 | 239 | self.items[name]["name"] = value |
227 | 240 | else: |
228 | 241 | try: |
229 | | - value = float(value) |
230 | | - if self.items[name]["size"] != value: |
| 242 | + new_value = float(value) |
| 243 | + if self.items[name]["size"] != new_value: |
231 | 244 | changed = True |
232 | | - self.items[name]["size"] = value |
233 | | - except: |
234 | | - print( |
235 | | - "can't set compartment {} to {}".format( |
236 | | - self.items[name]["name"], value |
237 | | - ) |
| 245 | + self.items[name]["size"] = new_value |
| 246 | + value = new_value |
| 247 | + except (TypeError, ValueError): |
| 248 | + logger.warning( |
| 249 | + "Unable to set compartment {!r} to {!r}; keeping existing size {!r}".format( |
| 250 | + self.items[name]["name"], |
| 251 | + value, |
| 252 | + self.items[name]["size"], |
| 253 | + ), |
| 254 | + loc=f"{__file__} : NetworkCompartmentBlock.__setattr__()", |
238 | 255 | ) |
239 | 256 | if changed: |
240 | 257 | self._changes[name] = value |
@@ -276,10 +293,13 @@ def __setattr__(self, name, value) -> None: |
276 | 293 | changed = True |
277 | 294 | self.items[name]["name"] = value |
278 | 295 | else: |
279 | | - print( |
280 | | - "can't set group {} to {}".format( |
281 | | - self.items[name]["name"], value |
282 | | - ) |
| 296 | + logger.warning( |
| 297 | + "Unable to set group {!r} to {!r}; keeping existing group {!r}".format( |
| 298 | + self.items[name]["name"], |
| 299 | + value, |
| 300 | + self.items[name]["name"], |
| 301 | + ), |
| 302 | + loc=f"{__file__} : NetworkGroupBlock.__setattr__()", |
283 | 303 | ) |
284 | 304 | if changed: |
285 | 305 | self._changes[name] = value |
@@ -321,10 +341,13 @@ def __setattr__(self, name, value) -> None: |
321 | 341 | changed = True |
322 | 342 | self.items[name]["name"] = value |
323 | 343 | else: |
324 | | - print( |
325 | | - "can't set species {} to {}".format( |
326 | | - self.items[name]["name"], value |
327 | | - ) |
| 344 | + logger.warning( |
| 345 | + "Unable to set species {!r} to {!r}; keeping existing species {!r}".format( |
| 346 | + self.items[name]["name"], |
| 347 | + value, |
| 348 | + self.items[name]["name"], |
| 349 | + ), |
| 350 | + loc=f"{__file__} : NetworkSpeciesBlock.__setattr__()", |
328 | 351 | ) |
329 | 352 | if changed: |
330 | 353 | self._changes[name] = value |
|
0 commit comments