Outils pour utilisateurs

Outils du site


printf

Un module pour simuler le printf du C

Objectif

Il s'agit de créer une fonction printf(format, arg1, arg2, arg3) qui traite en fait: format % (arg1, arg2, arg3).

Après importation du module ci-dessous appelé printf.py, on dispose d'une fonction printf() qui s'utilise comme suit:

printf(format, arg1, arg2, arg3)

Exemple:

printf("%d  %f  %s", 123, 98.5643, "toto")
123  98.564300  toto

On ajoute une fonctionnalité supplémentaire: on transforme toutes les chaines en unicode avant l'application du format, et on applique ensuite, après l'application du format, l'encodage de la console de sortie pour un affichage correct. Cela permet d'éviter des occasions d'erreurs provoquées par des conversions intempestives.

On considère dans ce cas:

  • que l'encodage des chaines non-unicodes est decod ('utf-8' par défaut)
  • que l'encodage de la console d'affichage est sys.stdout.encoding par défaut

On peut, bien entendu, modifier ces 2 encodages avec printf.config(decod, encod)

Module proposé

#!/usr/bin/python
# -*- coding:utf-8 -*-
 
import sys
 
def _formchaine(ch, decod, encod):
    """retourne la chaine ch avec le bon encodage pour l'affichage
       (fonction utilitaire des classes Printx et Printf)
    """
    if isinstance(ch,unicode):
        return ch.encode(encod, 'replace')
    else:
        if decod==encod:
            return ch
        else:    
            return ch.decode(decod).encode(encod, 'replace')
 
def formchaine(ch, decod='utf-8', encod=None):
    """retourne la chaine ch avec le bon encodage"""
    if encod==None:
        self.encod = sys.stdout.encoding
    return _formchaine(ch, decod, encod)
 
###############################################################################
class Printf(object):
 
    def __init__(self, decod='utf-8', encod=None):
        self.config(decod, encod)
        self.configure = self.config
 
    def config(self, decod='utf-8', encod=None):
        self.decod = decod
        if encod==None:
            self.encod = sys.stdout.encoding
        else:    
            self.encod = encod
 
    def __call__(self, *args):
        if len(args)==0:
            # pas de paramètre: passer à la ligne suivante
            print
        elif isinstance(args[0], (str, unicode)):
            # au moins 1 paramètre chaine: c'est une chaine de format
            L = []
            for a in args:
                # toutes les chaines sont converties en unicode
                if isinstance(a, str):
                    L.append(a.decode(self.decod, 'replace'))
                else:
                    L.append(a)
            print _formchaine(L[0] % tuple(L[1:]), self.decod, self.encod)
        else:
            # le 1er paramètre n'est pas une chaine de format
            for a in args:
                if isinstance(a, (str, unicode)):
                    print _formchaine(a, self.decod, self.encod),
                else:
                    print a,
            print
 
# instanciation
printf = Printf()
 
###############################################################################
if __name__ == '__main__': 
    pass


Suggestion d'importation:

from printf import printf


Exemple d'utilisation (après importation):

printf("abcéèçàù")
abcéèçàù
 
printf(u"abcéèçàù")
abcéèçàù
 
printf("%10d  %.7f  %s  %s", 123, 4.9876, "azertyôîûêâ", u"azertyôîûêâ")
       123  4.9876000  azertyôîûêâ  azertyôîûêâ
 
printf(u"%10d  %.7f  %s  %s", 123, 4.9876, "azertyôîûêâ", u"azertyôîûêâ")
       123  4.9876000  azertyôîûêâ  azertyôîûêâ
 
printf()
# passage à la ligne
 
printf(123, 1.23, "ÔÎÂÄ")
123 1.23 ÔÎÂÄ


Amusez-vous bien!

printf.txt · Dernière modification: 2009/10/18 18:05 de tyrtamos

Outils de la page