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:
On peut, bien entendu, modifier ces 2 encodages avec printf.config(decod, encod)
#!/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!