2015-05-01 15 views
7

Volevo vedere se shlex era una buona scelta per qualcosa che sto cercando di costruire, quindi ho pensato di metterlo in debug mode per giocare con esso. Solo, il costruttore di shlex ha questo weird thing it does: imposta self.debug su 0 e verifica immediatamente se è vero.Mettere shlex in modalità debug

… 
self.debug = 0 
self.token = '' 
self.filestack = deque() 
self.source = None 
if self.debug: 
    print 'shlex: reading from %s, line %d' \ 
      % (self.instream, self.lineno) 

so Python ha alcune potenti funzioni di metaprogrammazione, ma io non riesco a capire come questo è destinato a lavorare - anche se sovrascrivo il costruttore, non c'è alcun modo programmatico per ottenere tra l'impostazione del valore e della il suo uso.

Si suppone che ci sia un modo per emettere l'istruzione nella condizione if self.debug (e se sì, come?), È un bug, o c'è qualche terza possibilità che non ho considerato?

+1

Programmaticamente sicuramente c'è un modo: http://ideone.com/wcPVRg. Ma sembra davvero un vecchio codice [scritto nel 1999] (https://github.com/python/cpython/blob/2bdca80eb5d7757d4542e9e12e425a54a11fe300/Lib/shlex.py) e nessuno ha mai toccato quella parte. o_O –

+0

L'ultimo era un po 'hardcoded, ecco un modo leggermente diverso: http://ideone.com/lDCKvu –

+0

Sembra un bug. È perfettamente ragionevole per 'shlex' richiedere di impostare' s.debug = 1' solo dopo la costruzione ... ma in quel caso, non c'è una buona ragione per controllare 'self.debug' durante l'inizializzatore. – abarnert

risposta

2

In primo luogo, sono abbastanza sicuro che hai trovato un bug, e dovresti go report it. (Dovresti assicurarti che sia ancora presente in the latest 3.x code, ma ho appena controllato, e lo è.) Non vedo nulla di irragionevole sugli oggetti shlex che non ti permettono di impostare debug=1 fino a quando non sono inizializzati ... ma in quel caso, non dovrebbero controllare self.debug nell'inizializzatore, poiché non è possibile impostarlo in alcun modo.

Ma questo non è difficile da aggirare. L'unica cosa che perdi in questo modo è il primo messaggio, che stampa solo gli attributi pubblici che puoi stampare da solo. Così, per esempio:

class debugging_shlex(shlex): 
    def __init__(self, *args, **kwargs): 
     # shlex is an old-style class in 2.7, so no super 
     shlex.__init__(self, *args, **kwargs) 
     self.debug = 1 
     print('shlex: reading from %s, line %d' \ 
       % (self.instream, self.lineno)) 

Maggiori informazioni per la segnalazione di bug:

  • Il codice irraggiungibile è stato aggiunto in this 2000 change, e l'unico cambiamento da allora è stato quello di adattarsi a 80 colonne.
  • Non ci sono test di unità per l'argomento debug (non è sorprendente, dato che è a malapena documentato e dice semplicemente "se vuoi usare questo, leggi l'origine" ... ma potresti comunque voler aggiungere qualcosa).
+0

Bene, aprirò un bug, ma [l'elenco dei bug aperti non gestiti si riferisce a 'shlex'] (http://bugs.python.org/issue?% 40search_text = shlex & ignorare = file% 3Acontent & title = shlex &% 40columns = title & id = &% 40columns = id & stadio = & creazione = & creatore = & attività = &% 40columns = Attività &% 40sort = attività & attore = & ficcanaso = & type = & componenti = & Versioni = & dipendenze = & assegnatario = & parole chiave = & priority = & status = 1 &% 40columns = stato e risoluzione = & nosy_count = & message_count = &% 40group = &% 40pagesize = 50 &% 40startwith = 0 &% 40sortdir = on &% 40queryname = &% 40old-queryname = &% 40action = ricerca) non dammi molta speranza – kojiro

+0

[Bug aperto] (http://bugs.python.org/issue24113). – kojiro

+0

@kojiro: La mia ipotesi è che se invii una patch rimuovendo quelle 2 righe, c'è una probabilità superiore a 50/50 che verrà accettata; se non si invia una patch, nessun altro si preoccuperà, e alla fine sarà un altro bug "shlex" di 47 mesi a cui nessuno importa. – abarnert

Problemi correlati