2015-06-05 20 views
5

Ho un dizionario che mi è passato da una funzione che non ho accesso al codice. In questo dizionario c'è una chiave chiamata 'time'. Posso print d['time'] e stampa il valore che mi aspetto. Tuttavia, quando si scorre il dizionario, questa chiave viene saltata. Anche d.keys() non lo include. Se è importante, le altre chiavi sono numeriche.Chiave del dizionario nascosta

Come potrei ricreare questo? Come vedi le chiavi nascoste senza conoscere il nome? Questo può essere annullato?

print type(d) rendimenti <type 'dict'>

+4

potrebbe per favore incollare il frammento di codice? –

+8

Probabilmente è un'istanza di una classe che si comporta come un dizionario? – ronakg

+4

Cosa succede quando si '' 'stampa d'''? – wwii

risposta

1

Python può fare praticamente qualsiasi cosa in risposta ad accesso oggetto dal momento che ogni classe può ridefinire __getitem__ (e, per dict sottoclassi, __missing__). Se la documentazione non lo copre, non esiste un modo ben definito per scoprire quali "chiavi nascoste" sono disponibili in un dato oggetto, a meno di ispezionare il codice sorgente.

+0

Purtroppo non ho accesso al codice sottostante, quindi per ora dovrò solo usare quello che mi hanno dato.Sembra che i tipi di dizionario predefiniti non abbiano spazio per le chiavi nascoste, quindi non c'è modo per me di sapere veramente cosa sta succedendo senza accesso al codice. – blindguy

+0

Mi sembra che se il codice è scritto in Python (ma non hai il codice sorgente, solo il file '.pyc' compilato) potresti probabilmente scavare con il disassemblatore (modulo' dis') per trovare fuori alcune cose – kindall

1

Prima di tutto: non dare per scontato che si tratti di dizionario, testarlo, funzione bult-in tipo (d) indicherà la classe/tipo dell'oggetto d. Nota: non utilizzare tipo per verificare il tipo, per quella funzione istanza.

di rispondergli domanda: Sì, si può fare, vedere questo: http://www.diveintopython3.net/special-method-names.html#acts-like-dict

anche se si sta indagando dicts non dimenticare dict.items che è simile alle chiavi, ma stampa le chiavi e valori .

Infine, non utilizzare il debug di stampa , utilizzare https://docs.python.org/2/library/pdb.html o https://pypi.python.org/pypi/ipdb.

questo semplice combo

import pdb; pdb.set_trace() 

ti porterà console interattiva dove serve ...

Quindi direi che la sua molto possibile. Si tratta solo di getitem ... E no, è molto probabile che sia irreversibile.

+0

Lo farò quando torno al lavoro lunedì, grazie per il suggerimento. l'altra risposta dipende in qualche modo dal risultato di questo. – blindguy

+0

Cerco di evitare assoluti come '' 'NON fare qualcosa'''. Le dichiarazioni/funzioni di stampa posizionate in modo strategico possono essere molto utili. – wwii

+0

questa risposta è stata utile. Non sapevo di poter ottenere questo tipo di debugging. – blindguy

0

Come altri hanno già detto, questo potrebbe essere implementato in vari modi. Forse il più banale è un defaultdict, anche se questo aggiungerà tasti sulla ricerca:

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'] 

Specifiche dipendono da ciò che sta realmente accadendo.

2

riproduzione semplice:

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' 
Problemi correlati