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
risposta
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
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
'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
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. –
Per me sembra che voglia controllare l'intera fonte e non farlo in * qualche * punto durante l'esecuzione – ThiefMaster
- 1. SQLAlchemy: impedire la chiusura automatica
- 2. impedire la conversione automatica di singola colonna di vettore
- 3. La stampa automatica non funziona in Java
- 4. Come impedire la fuga automatica nei template di Django?
- 5. Generazione automatica di generatori aperti decorati mediante scansione di assieme
- 6. Codice di formattazione automatica
- 7. Come impedire la funzione dalla stampa?
- 8. Come impedire ai motori di ricerca di eseguire la scansione dell'intero sito Web?
- 9. Impedire a XslCompiledTransform di utilizzare tag a chiusura automatica
- 10. Come impedire la chiusura automatica delle parentesi graffe in ReSharper?
- 11. Come impedire TextBlock di ottenere messa a fuoco automatica
- 12. Come impedire ai robot di eseguire la scansione dei miei URL basati su AJAX?
- 13. Android AOSP - Definizione dell'intervallo di scansione e finestra di scansione nel codice sorgente Android
- 14. Stampa automatica immagine dal sito web
- 15. Abilita e disabilita la rotazione automatica a livello di codice?
- 16. Come impedire il tag di chiusura automatica in php simplexml
- 17. Come impedire a Jackson di emettere una bella stampa JSON?
- 18. Chrome: esecuzione automatica per il codice Javascript?
- 19. Generazione automatica di codice per Strings.xml da Eclipse
- 20. Qual è il codice CSS per eseguire interruzioni di pagina per la stampa di pagine Web?
- 21. Soluzione per SCAN_FAILED_APPLICATION_REGISTRATION_FAILED di scansione BLE?
- 22. È legale eseguire la scansione di Amazon?
- 23. Componenti di scansione TWAIN per Delphi
- 24. Titolo generale per la finestra di stampa
- 25. Impossibile eseguire la scansione per le classi di dentro/IlluminateQueueClosure.php
- 26. Java: stringa di scansione per un pattern
- 27. Scansione codice a barre in una casella di testo specifica
- 28. Evita la scansione di URL duplicati
- 29. Come eseguire la scansione di intere Wikipedia?
- 30. Documentazione automatica del codice ColdFusion
Perché non basta fare con il vostro editor di testo? – Blender
ctrl f o ctrl r nell'editor di testo .... –
L'editor di testo non è in grado di eseguire comandi sull'esecuzione del codice. – captainandcoke