2010-09-08 7 views
1

Compte tenu du fichier d'entrée suivante:Comment accomplir cela en python?

a = 2 
b = 3 
c = a * b 
d = c + 4 

Je veux exécuter le fichier d'entrée ci-dessus grâce à un programme de python qui produit la sortie suivante:

a = 2 
b = 3 
c = a * b = 6 
d = c + 4 = 10 

Le fichier d'entrée est un programme python juridique, mais la sortie est en python avec une sortie supplémentaire qui imprime la valeur de chaque variable à droite de la déclaration/affectation . Sinon, la sortie pourrait ressembler à:

a = 2 
b = 3 
c = a * b 
c = 6 
d = c + 4 
d = 10 

La motivation est d'implémenter un simple « bloc-notes de l'ingénieur » qui permet chaînes de calculs sans avoir besoin des instructions d'impression dans le fichier source.

Voici ce que j'ai après avoir modifié la contribution de D.Shawley (très apprécié):

#! /usr/bin/env python 

from math import * 

import sys 
locals = dict() 

for line in sys.stdin: 
    line = line.strip() 
    if line == '': 
    continue 
    saved = locals.copy() 
    stmt = compile(line,'<stdin>','single') 
    eval(stmt,None,locals) 
    print line, 
    for (k,v) in locals.iteritems(): 
    if k not in saved: 
     print '=', v, 
    print 
+1

veuillez formater votre code en utilisant les outils intégrés la prochaine fois. –

+1

Aussi, pouvez-vous essayer de clarifier de quelle sorte d'interface nous parlons? Est-ce que la sortie sera un fichier texte? Affiché à l'écran? –

+0

L'interface est: entrée à partir du fichier ou stdin, sortie à stdout. Exécution à partir de la ligne de commande linux. Jusqu'à présent, j'ai juste un script python avec des instructions d'impression qui vident les noms et le contenu des variables. Vous voulez créer un programme qui "auto-imprime" les noms de variables et leurs valeurs. – gregben

Répondre

0

Quelque chose comme ce qui suit est un bon début. Ce n'est pas très Pythonic, mais c'est assez proche. Il ne fait pas la distinction entre les variables nouvellement ajoutées et celles qui ont été modifiées.

#! /usr/bin/env python 
import sys 
locals = dict() 
for line in sys.stdin: 
    saved = locals.copy() 
    stmt = compile(line, '<stdin>', 'single') 
    eval(stmt, None, locals) 
    print line.strip(), 
    for (k,v) in locals.iteritems(): 
     if k not in saved: 
      print '=', v, 
    print 
+0

Cela évalue certainement chaque expression ligne par ligne mais ne répond pas aux exigences de sortie de la question ;-) Cela dit, cela devrait donner à @gregben assez de Python pour pouvoir terminer son affectation. – Johnsyweb

+0

C'est très, très utile. Je vous remercie! – gregben

+0

J'ai modifié votre code pour ignorer les lignes vides. BTW, ce n'est pas une cession. Je cherchais simplement un remplacement simple pour mathcad que je pourrais courir dans un terminal. – gregben

Questions connexes