3 votes

Python : comment appeler `print` depuis `eval` dans une boucle ?

Quand j'appelle print de eval :

def printList(myList):
    maxDigits = len(str(len(myList)))
    Format = '0{0}d'.format(maxDigits)
    for i in myList:
        eval('print "#{0:' + Format + '}".format(i+1), myList[i]')

il donne une erreur :

    print "#{0:01d}".format(i+1), myList[i]
        ^
SyntaxError: invalid syntax

J'ai essayé d'utiliser ce et l'a réécrit :

def printList(myList):
    maxDigits = len(str(len(myList)))
    Format = '0{0}d'.format(maxDigits)
    for i in myList:
        obj = compile(src, '', 'exec')
        eval('print "#{0:' + Format + '}".format(i+1), myList[i]')

mais ce dernier se plaint de la i :

NameError: name 'i' is not defined

P.S. Je m'occupe de python2.6

8voto

eumiro Points 56644

Vous n'avez pas besoin d'évaluation :

def printList(myList):
    maxDigits = len(str(len(myList)))
    str_format = '#{0:0' + str(maxDigits) + '}'
    for i, elem in enumerate(myList, 1):
        print str_format.format(i), elem

ou, comme l'a fait remarquer @SvenMarnach, vous pouvez même mettre le paramètre de formatage dans un appel de format :

def printList(myList):
    maxDigits = len(str(len(myList)))
    for i, elem in enumerate(myList, 1):
        print '#{1:0{0}} {2}'.format(maxDigits, i, elem)

3voto

Gandaro Points 1707

Pour conserver votre code tout en le rendant plus court et plus facile à comprendre :

def printList(myList):
    # int(math.log10(len(myList))+1) would be the appropriate way to do that:
    maxDigits = len(str(len(myList)))
    for i in myList:
        print "#{0:0{1}d}".format(i+1, maxDigits), myList[i]

1voto

S.Lott Points 207588

La vision simpliste est la suivante. Construisez le format séparément de son utilisation. Évitez eval() .

    format =  "#{0:" + Format + "}"
    print format.format(i+1), myList[i]

Ne rendez pas les choses plus difficiles qu'elles ne doivent l'être. Voici une autre version qui construit le format en une seule étape.

    format = '#{{0:0{0}d}}'.format(maxDigits)
    print format.format(i+1), myList[i]

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X