2015-06-05 4 views
5

मेरे पास एक ऐसा शब्दकोश है जो मुझे उस फ़ंक्शन से पास कर दिया गया है जिसके पास मेरे पास कोड तक पहुंच नहीं है। इस शब्दकोश में 'time' नामक एक कुंजी है। मैं print d['time'] कर सकता हूं और यह मेरे द्वारा अपेक्षित मूल्य प्रिंट करता है। हालांकि, जब मैं शब्दकोश के माध्यम से पुनरावृत्ति करता हूं, तो यह कुंजी छोड़ दी जाती है। d.keys() में इसे शामिल नहीं किया गया है। यदि यह महत्वपूर्ण है, तो अन्य चाबियाँ संख्यात्मक हैं।छिपी हुई शब्दकोश कुंजी

मैं इसे कैसे पुनर्जीवित करूं? नाम जानने के बिना आप छिपी हुई कुंजियां कैसे देखते हैं? क्या इसे पूर्ववत किया जा सकता है?

print type(d) रिटर्न <type 'dict'>

+4

आप कृपया कोड स्निपेट पेस्ट सकते हैं? –

+8

यह शायद एक वर्ग का एक उदाहरण है जो एक शब्दकोश की तरह कार्य करता है? – ronakg

+4

क्या होता है जब आप '' 'प्रिंट'''' करते हैं? – wwii

उत्तर

1

अजगर आइटम का उपयोग के जवाब में काफी कुछ भी कर सकता है, क्योंकि किसी भी वर्ग __getitem__ को फिर से परिभाषित कर सकते हैं (और, dict उपवर्गों, __missing__ के लिए)। यदि प्रलेखन इसे कवर नहीं करता है, तो किसी भी दिए गए ऑब्जेक्ट में "छिपी हुई कुंजी" उपलब्ध हैं, यह जानने के लिए कोई अच्छी तरह से परिभाषित तरीका नहीं है, स्रोत कोड का निरीक्षण करने से कम।

+0

दुर्भाग्यवश मेरे पास अंतर्निहित कोड तक पहुंच नहीं है, इसलिए अब मुझे केवल उन चीज़ों का उपयोग करना होगा जो उन्होंने मुझे दिया था।डिफॉल्ट डिक्शनरी प्रकारों की तरह ध्वनि में छिपी हुई कुंजियों के लिए कमरा नहीं है, इसलिए मुझे वास्तव में यह जानने का कोई तरीका नहीं है कि कोड तक पहुंच के बिना क्या चल रहा है। – blindguy

+0

यह मेरे लिए होता है कि यदि कोड पायथन में लिखा गया है (लेकिन आपके पास स्रोत कोड नहीं है, केवल संकलित '.pyc' फ़ाइल) है, तो आप संभवतः डिस्सेबलर ('डी' मॉड्यूल) के साथ इसके आसपास खोद सकते हैं कुछ सामान बाहर करो। – kindall

1

सबसे पहले: यह न मानें कि यह शब्दकोश है, परीक्षण करें, बल्ट-इन फ़ंक्शन प्रकार (डी) आपको डी ऑब्जेक्ट का वर्ग/प्रकार बताएगा। नोट: टाइप का उपयोग करने के लिए isinstance फ़ंक्शन का उपयोग करने के लिए उपयोग न करें। हाँ, यह किया जा सकता है, यह देखने:

आप सवाल का जवाब देने http://www.diveintopython3.net/special-method-names.html#acts-like-dict

इसके अलावा, आप जांच कर रहे हैं, तो dicts के बारे में dict.items जो कुंजी के समान है लेकिन कुंजी और मूल्यों बाहर प्रिंट मत भूलना ।

अंत में, प्रिंट डिबगिंग का उपयोग न करें, https://docs.python.org/2/library/pdb.html या https://pypi.python.org/pypi/ipdb का उपयोग करें।

इस सरल कॉम्बो

import pdb; pdb.set_trace() 

आप इंटरैक्टिव सांत्वना जहां इसकी जरूरत मिल जाएगा ...

तो मैं इसकी बहुत संभव कहेंगे। यह लगभग getitem है ... और नहीं, इसकी संभावना अपरिवर्तनीय है।

+0

मैं यह करूँगा जब मैं सोमवार को काम पर वापस आऊंगा, टिप के लिए धन्यवाद। अन्य उत्तर इसके परिणामस्वरूप कुछ हद तक निर्भर हैं। – blindguy

+0

मैं 'कुछ न करें''' जैसे पूर्ण से बचने की कोशिश करता हूं। सामरिक रूप से रखा गया प्रिंट स्टेटमेंट/फ़ंक्शंस बहुत उपयोगी हो सकता है। – wwii

+0

यह उत्तर सहायक था। मुझे नहीं पता था कि मैं इस तरह के डिबगिंग प्राप्त कर सकता हूं। – blindguy

0

जैसा कि अन्य ने कहा है, इसे किसी भी तरीके से कार्यान्वित किया जा सकता है।

import time 
from collections import defaultdict 

with_hidden_key = defaultdict(time.time, { 
    "foo": 123, 
    "bar": 1024, 
    "bash": "YOLO", 
}) 
list(with_hidden_key) 
#>>> ['foo', 'bar', 'bash'] 

with_hidden_key["time"] 
#>>> 1433546635.5777457 

list(with_hidden_key) 
#>>> ['foo', 'bar', 'time', 'bash'] 

विशिष्ट तथ्य क्या वास्तव में हो रहा है पर निर्भर करते हैं: शायद सबसे तुच्छ एक defaultdict, हालांकि यह देखने पर कुंजी जोड़ना होगा है।

2

सरल प्रजनन:

class fake_dict(dict): 
    def __getitem__(self, item): 
     if item == 'time': 
      return 'x' 


d = fake_dict({'a': 'b', 'c': 'd'}) 
assert isinstance(d, dict) 
assert 'time' not in d.keys() 
print d # {'a': 'b', 'c': 'd'} 
assert d['time'] == 'x' 
संबंधित मुद्दे