From 99f939026fcd5c38238217ce25105db132a010de Mon Sep 17 00:00:00 2001 From: Ebag333 Date: Thu, 9 Mar 2017 12:14:23 -0800 Subject: [PATCH] Refactor some logic in modifiedAttributeDict --- eos/modifiedAttributeDict.py | 92 +++++++++++++++------- gui/builtinStatsViews/capacitorViewFull.py | 7 +- service/fit.py | 4 + 3 files changed, 71 insertions(+), 32 deletions(-) diff --git a/eos/modifiedAttributeDict.py b/eos/modifiedAttributeDict.py index bc8dfd9a1..6e303f602 100644 --- a/eos/modifiedAttributeDict.py +++ b/eos/modifiedAttributeDict.py @@ -19,6 +19,7 @@ import collections from math import exp +from types import NoneType defaultValuesCache = {} cappingAttrKeyCache = {} @@ -26,24 +27,22 @@ cappingAttrKeyCache = {} class ItemAttrShortcut(object): def getModifiedItemAttr(self, key, default=None): - try: - if key in self.itemModifiedAttributes: - return self.itemModifiedAttributes[key] - else: - return default - except AttributeError: - return default + return_value = self.itemModifiedAttributes.get(key) + + if isinstance(return_value, NoneType) and not isinstance(default, NoneType): + return_value = default + + return return_value class ChargeAttrShortcut(object): def getModifiedChargeAttr(self, key, default=None): - try: - if key in self.chargeModifiedAttributes: - return self.chargeModifiedAttributes[key] - else: - return default - except AttributeError: - return default + return_value = self.chargeModifiedAttributes.get(key) + + if isinstance(return_value, NoneType) and not isinstance(default, NoneType): + return_value = default + + return return_value class ModifiedAttributeDict(collections.MutableMapping): @@ -102,18 +101,48 @@ class ModifiedAttributeDict(collections.MutableMapping): def overrides(self, val): self.__overrides = val + @property + def modified(self): + return self.__modified + + @modified.setter + def modified(self, val): + self.__modified = val + def __getitem__(self, key): + ''' # Check if we have final calculated value - if key in self.__modified: - if self.__modified[key] == self.CalculationPlaceholder: - self.__modified[key] = self.__calculateValue(key) - return self.__modified[key] + if key in self.modified: + if self.modified[key] == self.CalculationPlaceholder: + self.modified[key] = self.__calculateValue(key) + return self.modified[key] # Then in values which are not yet calculated elif key in self.__intermediary: return self.__intermediary[key] # Original value is the least priority else: return self.getOriginal(key) + ''' + + # Check if we have final calculated value + key_value = self.modified.get(key) + if key_value is self.CalculationPlaceholder: + key_value = self.modified[key] = self.__calculateValue(key) + + if not isinstance(key_value, NoneType): + return key_value + + # Then in values which are not yet calculated + if self.__intermediary: + val = self.__intermediary.get(key) + else: + val = None + + if not isinstance(val, NoneType): + return val + else: + # Original value is the least priority + return self.getOriginal(key) def __delitem__(self, key): if key in self.__modified: @@ -122,11 +151,18 @@ class ModifiedAttributeDict(collections.MutableMapping): del self.__intermediary[key] def getOriginal(self, key): - if self.OVERRIDES and key in self.__overrides: - return self.__overrides.get(key).value - val = self.__original.get(key) - if val is None: - return None + val = None + + if self.__overrides: + val = self.__overrides.get(key, None) + elif self.overrides: + val = self.overrides.get(key, None) + + if isinstance(val, NoneType): + if self.__original: + val = self.__original.get(key, None) + elif self.original: + val = self.original.get(key, None) return val.value if hasattr(val, "value") else val @@ -134,12 +170,12 @@ class ModifiedAttributeDict(collections.MutableMapping): self.__intermediary[key] = val def __iter__(self): - all = dict(self.__original, **self.__modified) - return (key for key in all) + all_dict = dict(self.__original, **self.__modified) + return (key for key in all_dict) def __contains__(self, key): return (self.__original is not None and key in self.__original) or \ - key in self.__modified or key in self.__intermediary + key in self.__modified or key in self.__intermediary def __placehold(self, key): """Create calculation placeholder in item's modified attribute dict""" @@ -366,6 +402,6 @@ class ModifiedAttributeDict(collections.MutableMapping): class Affliction(object): - def __init__(self, type, amount): - self.type = type + def __init__(self, affliction_type, amount): + self.type = affliction_type self.amount = amount diff --git a/gui/builtinStatsViews/capacitorViewFull.py b/gui/builtinStatsViews/capacitorViewFull.py index b30265741..49bb9d59b 100644 --- a/gui/builtinStatsViews/capacitorViewFull.py +++ b/gui/builtinStatsViews/capacitorViewFull.py @@ -114,11 +114,10 @@ class CapacitorViewFull(StatsView): ("label%sCapacitorRecharge", lambda: fit.capRecharge, 3, 0, 0), ("label%sCapacitorDischarge", lambda: fit.capUsed, 3, 0, 0), ) - if fit is None: - # Set default if fit is empty - neut_resist = 0 - else: + if fit: neut_resist = fit.ship.getModifiedItemAttr("energyWarfareResistance", 0) + else: + neut_resist = 0 panel = "Full" for labelName, value, prec, lowest, highest in stats: diff --git a/service/fit.py b/service/fit.py index 70a471042..96ce5c056 100644 --- a/service/fit.py +++ b/service/fit.py @@ -19,6 +19,7 @@ import copy from logbook import Logger +from time import time import eos.db from eos.saveddata.booster import Booster as es_Booster @@ -1028,9 +1029,12 @@ class Fit(object): self.recalc(fit) def recalc(self, fit, withBoosters=True): + start_time = time() pyfalog.info("=" * 10 + "recalc" + "=" * 10) if fit.factorReload is not self.serviceFittingOptions["useGlobalForceReload"]: fit.factorReload = self.serviceFittingOptions["useGlobalForceReload"] fit.clear() fit.calculateModifiedAttributes(withBoosters=False) + + pyfalog.info("=" * 10 + "recalc time: " + str(time() - start_time) + "=" * 10)