2017-11-29 2 views
0

Ich habe eine Datei mit dem Namen string_constants, die wie folgt aussehen -Python- verkürzen Code

class ModelEntityKeys: 
    MODEL_ENTITY_DATA = 'model_entity_data' 
    NETWORK_NAME = 'network_name' 
    MODEL_FACTORS= 'model_factors' 
    CLASSES= 'classes' 
    COEF = 'coef_' 
    INTERCEPT = 'intercept_' 
    N_ITER = 'n_iter_' 
    VARIABLES = 'variables' 
    CATG_VARIABLES = "catg_variables" 
    CONT_VARIABLES = "cont_variables" 
    LABEL_NAME = "label_name" 
    TEST_COST = "test_cost" 
    TEST_ACCURACY = "test_accuracy" 
    TEST_TIME_ELAPSED = "test_time_elapsed" 
    EPOCH_TIME_ELAPSED = "epoch_time_elapsed" 
    EPOCH_ACCURACY = "epoch_accuracy" 
    EPOCH_COST = "epoch_cost" 
    GRAPH_SAVE_PATH = "graph_save_path" 
    DATA_SAVE_PATH = "data_save_path" 
    ML_SAVE_PATH = "ml_save_path" 
    DL_SAVE_PATH = "dl_save_path" 
    MODEL_NAME = "model_name" 
    TIMESTAMP = "timestamp" 
    COST = "cost" 

Es gibt nur wenige andere solche Klassen. Ich importieren diese Strings sie als Schlüssel zu einem Wörterbuch passieren und das ist, was ich habe -

from xai.string_constants import ModelEntityKeys 
# omitting some code 
# ... 
    self.intercept = self.data_all_entity_dict[ModelEntityKeys.MODEL_ENTITY_DATA][ModelEntityKeys.MODEL_FACTORS][ModelEntityKeys.INTERCEPT] 

Das Wörterbuch self.data_all_entity_dict ist eine verschachtelte Wörterbuch, das so etwas wie this-

{ 
    "model_entity_data": { 
    "network_name": "sample_2_logistic_network", 
    "model_name": "sample_2_logistic_model", 
    "timestamp": "20171129_142512", 
    "cost": "mse", 
    "path": { 
     "dl_save_path": "/saves/dl/", 
     "ml_save_path": "/saves/ml/", 
     "data_save_path": "/data/", 
     "graph_save_path": "/graphs/tf/" 
    }, 
    "train_meta": { 
     "epoch_cost": 0.10952380952380952, 
     "epoch_accuracy": 0.8904761904761904, 
     "epoch_time_elapsed": "0:00:00.002164" 
    }, 
    "test_meta": { 
     "test_cost": 0.13333333333333333, 
     "test_accuracy": 0.8666666666666667, 
     "test_time_elapsed": "0:00:00.000675" 
    }, 
    "model_factors": { 
     "classes_": [ 
     0.0, 
     1.0 
     ], 
     "coef_": [ 
     [ 
      0.007875385355666441, 
      8.192464586946051e-06, 
      0.006161374233310335, 
      -0.051444957788776335, 
      0.00043294254544011014, 
      0.00017207830816790075, 
      -0.00020155122167492249 
     ] 
     ], 
     "intercept_": [ 
     0.0004034696319330871 
     ], 
     "n_iter_": [ 
     10 
     ], 
     "variables": [ 
     "age", 
     "income", 
     "edu_yrs", 
     "yrs_since_exercise", 
     "security_label_<prefix>_A", 
     "security_label_<prefix>_B", 
     "security_label_<prefix>_C" 
     ], 
     "catg_variables": [ 
     "security_label" 
     ], 
     "cont_variables": [ 
     "age", 
     "income", 
     "edu_yrs", 
     "yrs_since_exercise" 
     ], 
     "label_name": "prob" 
    } 
    } 
} 

Das Problem aussieht, ist das mit

self.intercept = self.data_all_entity_dict[ModelEntityKeys.MODEL_ENTITY_DATA][ModelEntityKeys.MODEL_FACTORS][ModelEntityKeys.INTERCEPT] 

wird zu lang und tötet die Lesbarkeit. Gibt es eine Möglichkeit, diese Linie zu verkürzen?

+2

Sie können ohne Schrägstriche oder andere hässliche zusätzliche Dekorationen Zeilenumbrüche in Klammern haben. 'dict [' (newline) 'ModelEntityKeys.MODEL_ENTITY_DATA' (newline) usw. – tripleee

+0

Gibt es eine Möglichkeit, das zu verkürzen. Ich verstehe, was Sie vorschlagen. Ich möchte nur weniger Zeichen verwenden. Kann ich etwas in der 'string_constants' Datei oder im Import ändern? –

+1

'ModelEntityKeys.MODEL_ENTITY_DATA.MODEL_FACTORS' stimmt nicht mit Ihrer' ModelEntityKeys' Definition überein - sollte 'ModelEntityKeys.MODEL_FACTOR' lauten ... –

Antwort

3

können Sie erste ModelEntityKeys verkürzen beim Import:

from xai.string_constants import ModelEntityKeys as mek 

dann alias self.data_all_entity_dict etwas kürzer:

d = self.data_all_entity_dict 
self.intercept = d[mek.MODEL_ENTITY_DATA][mek.MODEL_FACTORS][mek.INTERCEPT] 

Aber eigentlich, was ich all das Wissen über die zu halten wäre tun würde, "data_all_entity_dict" Struktur an einem einzigen Ort und bieten Getter-Methoden:

Dann

from xai.string_constants import ModelEntity 
entity = ModelEntity(self.data_all_entity_dict) 
self.intercept = entity.intercept 
+0

Dies ist ein guter Ratschlag. Vielen Dank –