8

क्या डेटास्टोर में पाइथन शब्दकोश स्टोर करने का कोई अच्छा तरीका है? मैं कुछ ऐसा करना चाहता हूं:मैं डेटास्टोर में शब्दकोश कैसे डालूं?

from google.appengine.ext import db 

class Recipe(db.Model): 
    name = db.StringProperty() 
    style = db.StringProperty() 
    yeast = db.StringProperty() 
    hops = db.ListofDictionariesProperty() 

बेशक, वह अंतिम पंक्ति वास्तव में काम नहीं करती है। मुझे होप्स को कुंजी-मूल्य जोड़े की एक सूची होने की आवश्यकता है, जहां कुंजी हमेशा एक स्ट्रिंग होती है और मान एक स्ट्रिंग, int, या फ्लोट हो सकता है, लेकिन मैं इसमें कुछ भी नहीं देख सकता जो मुझे ऐसा करने की अनुमति देगा Property classes

उत्तर

7

repr के साथ एक नियम को क्रमबद्ध करने का यह एक अच्छा तरीका है। इसके बाद आप इसे eval के साथ पुन: स्थापित कर सकते हैं, या यदि आप डेटा पर भरोसा नहीं करते हैं, तो "safe eval"।

पिकलिंग पर repr का एक लाभ यह है कि डेटा डेटाबेस में पठनीय है, यहां तक ​​कि बेताब मामलों में भी पूछताछ योग्य है।

+1

JSON आम तौर पर eval अधिक सुरक्षित है। –

+0

मुझे शायद उस क्षेत्र से पूछताछ करने की आवश्यकता नहीं होगी, लेकिन मुझे पसंद है कि मेरे पास विकल्प है। साथ ही, अगर मैं गलत हूं, तो मुझे सही करें, लेकिन रिप्र का उपयोग नहीं करेंगे और जेएसओएन का उपयोग इस मामले में एक ही आउटपुट होगा? –

+0

"सुरक्षित eval" के साथ भी, 'repr' खतरनाक हो सकता है। Guido खुद को संदेह है कि आप इस तरह के एक समारोह लिख सकते हैं। Http://code.google.com/p/googleappengine/issues/detail?id=671 देखें। जेएसओएन पायथन से सरल है, और मुझे पूरा भरोसा है कि एक JSON पार्सर इस तरह से कमजोर नहीं होगा कि 'eval' हो सकता है। – lemnar

2

आप शब्दकोश को pickle शब्दकोश और स्ट्रिंगप्रोपर्टी के रूप में स्टोर कर सकते हैं।

2

मुझे यकीन है कि पाइथन शब्दकोश को स्टोर करने का कोई तरीका नहीं है। लेकिन क्यों न केवल दूसरे मॉडल के रूप में आप हॉप में क्या चाहते हैं?

इसके अलावा, जैसा कि जॉन ने उल्लेख किया है, आप अचार का उपयोग कर सकते हैं, लेकिन (और अगर मैं गलत हूं तो मुझे सही करें) इसे Blob मान के रूप में स्टोर करें।

+1

@ बार्टक, आप स्ट्रिंग के साथ काम करने के लिए अचार और पिक मॉड्यूल के कार्यों को लोड कर सकते हैं: >>> cPickle.loads (cPickle.dumps ({1: "one"}) {1: 'one'} – Mark

1

आपके विकल्प मूल रूप से एक डीबी.एक्सपांडो का उपयोग करने के लिए अचार का उपयोग करने के लिए हैं और प्रत्येक कुंजी को एक अलग संपत्ति में बनाते हैं, या स्ट्रिंगलिस्ट की कुंजी की कुंजी और मूल्यों में से एक और ज़िप() उन्हें वापस एक dict पढ़ने।

7

आप json

+0

+1: जेएसओएन नियम। –

+1

@gnibbler: 'dict' को JSON प्रारूप में कनवर्ट करें और इसे 'db.StringProperty' के रूप में संग्रहीत करें? – Kit

+0

@ किट, हाँ। Repr/eval से अधिक सुरक्षित होने और आपको "सुरक्षित eval" लिखने से बचाने के अलावा, JSON अधिक पोर्टेबल है, क्या आप स्वयं को किसी चरण में एक अलग भाषा का उपयोग करना चाहिए –

0

उपयोग कर सकते हैं मैं इसे इस तरह से किया था:

class MyEntity(db.Model): 
    dictionary_string = db.StringProperty() 

payload = {{}...{}} 

# Store dict 
my_entity = MyEntity(key_name=your_key_here) 
my_entity.dictionary_string = str(payload) 
my_entity.put() 

# Get dict 
import ast 
my_entity_k = db.Key.from_path('MyEntity', your_key_here) 
my_entity = db.get(my_entity_k) 
payload = ast.literal_eval(my_entity.dictionary_string) 
संबंधित मुद्दे