2016-07-16 11 views
-1

Ich habe wirklich große config.json Datei, die ich versuche zu lesen und generieren Getters aus in pycharm IDE.Wie erstelle ich Getters aus einer JSON-Datei in Pycharm

Probe config.json sieht wie folgt aus (. . . viele ähnliche Artikel zeigt):

{ 
    "key1" : "value1", 
    "key2" : "value2", 
    . 
    . 
    . 
    "key1000" : value1000 
} 

Meine Python ConfigRead.py Klasse wie etwa wie folgt aussieht:

import json 


class ConfigRead(object): 

    def __init__(self, file_path): 
     json_content = open(file_path).read() 
     self.jsonData = json.loads(json_content) 

    def get_config(self): 
     return self.jsonData 

    def get_key1(self): 
     return self.jsonData["key1"] 

nun ein 1000 Getter ist die Eingabe etwas, das ich Ich will es nicht versuchen.

Eclipse hatte Autogeneration Ansatz von Konfigurationsdateien. Ich bin auf PyCharm & migriert Ich bin nicht in der Lage, es herauszufinden.

Alle Leads sind hilfreich - einfach diesen Prozess. Vielen Dank.

Ich bin auch offen für alle Vorschläge, wenn Sie dies als einen schlechten Ansatz in python sehen. Ich bin offen, mein Design zu ändern, wenn es vereinfacht & macht die Dinge überschaubarer.

+0

Dies ist ein schlechter Ansatz in jeder Programmiersprache. Statt 'key1' zu' keyN', warum nicht stattdessen eine Liste (JSON-Array) verwenden? – jonrsharpe

+0

Ich habe kein Steuerelement, um das Schema der JSON-Datei heute zu ändern. – sudhishkr

+0

Aber Sie können ändern, wie es im Code dargestellt wird. Getter selbst sind auch nicht pythonisch. – jonrsharpe

Antwort

1

Haben Sie stattdessen die Implementierung __getitem__ in Betracht gezogen? __getitem__ ist die magische Methode, mit der Sie den Operator [] verwenden können, was meiner Meinung nach einen viel nachhaltigeren Ansatz darstellt, da Sie nicht bei jeder Änderung der Konfigurationsdatei den Quellcode ändern müssen. Ich weiß nicht, was Ihre spezifischen Anwendungsfall ist, sondern so etwas wie:

class ConfigRead(object): 

    def __init__(self, file_path): 
     json_content = open(file_path).read() 
     self.jsonData = json.loads(json_content) 

    def __getitem__(self, key): 
     return self.jsonData[key] 

Würden Sie schreiben lassen Sachen wie:

config = ConfigRead("path/to/file") 
name = config['key1'] 

Oder, wenn Sie haben keine zusätzlichen Verarbeitungs Sie Möchten Sie auf die Konfigurationsdaten zugreifen, könnten Sie einfach die JSON-Daten direkt wie folgt verwenden:

def read_config(file_path): 
    with open(file_path) as config_file: 
     return json.load(config_file) 

config = read_config("path/to/file") 
name = config['key1'] 
+0

Danke @Tutleman, Ja, das ist etwas was ich als Backup haben wollte. Das Problem bei diesem Ansatz besteht darin, dass die Schlüssel nicht in den Code abstrahiert werden, was bedeutet, dass, wenn ein Dienstentwickler dies verbraucht, er einen nicht existenten Schlüssel einspeisen kann. Um das zu vermeiden, wollte ich den obigen Ansatz haben. – sudhishkr

+0

@sudhishkr Sprechen Sie über einen Verbraucher, der versucht, nicht vorhandene Werte zu lesen? Wenn dem so ist, gibt es nicht viel zu tun - ein Entwickler könnte ebenso leicht (je nach seiner IDE, falls vorhanden) den Namen des Getters vertippen. In diesem Fall würde ein "AttributeError" ausgelöst werden. In diesem Fall wird ein 'KeyError' verursacht. – Tutleman

+0

ja du hast mich richtig verstanden. Ich denke, das ist eine nicht so komplizierte und anständige Änderung meiner derzeitigen Vorgehensweise. Danke! – sudhishkr

Verwandte Themen