2013-01-18 14 views
5

Ho un progetto Python su cui sto lavorando in cui anziché le istruzioni di stampa chiamo una funzione say() in modo da poter stampare le informazioni mentre sono in sviluppo e registrare le informazioni durante la produzione. Tuttavia, lo dimentico spesso e inserisco per sbaglio dichiarazioni di stampa nel codice. Esiste comunque la possibilità che il programma python legga la propria fonte e exit() se trova affermazioni di stampa al di fuori della funzione say()?Codice di scansione automatica per impedire la stampa di statuti

+1

Perché non basta fare con il vostro editor di testo? – Blender

+1

ctrl f o ctrl r nell'editor di testo .... –

+0

L'editor di testo non è in grado di eseguire comandi sull'esecuzione del codice. – captainandcoke

risposta

7

Questo può essere fatto utilizzando il modulo ast. Il seguente codice troverà qualsiasi chiamata dell'istruzione print e anche della funzione print() nel caso in cui si sia in Python 3 o Python 2 con il futuro print_function.

import ast 

class PrintFinder(ast.NodeVisitor): 
    def __init__(self): 
     self.prints_found = [] 

    def visit_Print(self, node): 
     self.prints_found.append(node) 
     super(PrintFinder, self).generic_visit(node) 

    def visit_Call(self, node): 
     if getattr(node.func, 'id', None) == 'print': 
      self.prints_found.append(node) 
     super(PrintFinder, self).generic_visit(node) 


def find_print_statements(filename): 
    with open(filename, 'r') as f: 
     tree = ast.parse(f.read()) 
    parser = PrintFinder() 
    parser.visit(tree) 
    return parser.prints_found 

print 'hi' 
for node in find_print_statements(__file__): 
    print 'print statement on line %d' % node.lineno 

L'output di questo esempio è:

hi
dichiarazione di stampa on line 24
dichiarazione di stampa on line 26

1

Anche se non consiglio di fare questo, se lo si desidera, si potrebbe fare in modo che l'interprete Python generasse un errore ridefinendo l'istruzione print.

Se si utilizza Python 3, è sufficiente mettere questo vicino all'inizio/parte superiore del vostro codice:

print = None 

Se ci sono print dichiarazioni, si otterrà un errore di TypeError: 'NoneType' object is not callable.

Se si utilizza Python 2.x, è possibile utilizzare l'idea suggerita in un altro answer per consentire a Python 2.x di avere un'istruzione di stampa sovrascrivibile.

from __future__ import print_function 
print = None 

aver realizzato tutto questo con la funzione say(), si potrebbe fare qualcosa di simile:

print_original = print 
print = None 

def say(data): 
    print = print_original 
    # Your current `say()` code here, such as: 
    print(data) # Could just use `print_original` instead. 
    # Redefine print to make the statement inaccessible outside this function. 
    print = None 
+0

'None' non è richiamabile in modo da generare un'eccezione quando è stata richiamata la nuova funzione' print' ". Non proprio quello che l'OP vuole. Soprattutto perché si romperà solo quando il codice viene effettivamente eseguito. – ThiefMaster

+1

L'OP dichiara che vorrebbe che il suo programma esca() se incontra eventuali dichiarazioni di stampa. Lanciare un'eccezione farà uscire il programma. Tuttavia, sono d'accordo che questa non è una cosa molto desiderabile in primo luogo, ma potrebbe funzionare per qualcuno che immagino. –

+1

Per me sembra che voglia controllare l'intera fonte e non farlo in * qualche * punto durante l'esecuzione – ThiefMaster

Problemi correlati