OVH Cloud OVH Cloud

Qui êtes-vous ? Que faites-vous ?

105 réponses
Avatar
Pierre
Salut à tous,

Je me présente, utilisateur Windows et développeur occasionnel en VB
pour le boulot, principalement pour réaliser des interfaces utilisateur
avec des systèmes d’acquisition de mesures physiques ou des commandes de
machines. Pourquoi VB ? Pour rester dans la continuité de ce qui avait
déjà été réalisé auparavant, tout simplement, le choix ne s'est jamais posé.
Actuellement, je cherche à évoluer dans un autre langage et à essayer
d’intégrer de plus en plus Linux, que se soit pour une utilisation
personnelle ou professionnelle.

Renseignements pris, Python me semble être un langage en vogue et promis
à un bel avenir !
Je n’ai malheureusement pas trouvé (je n’ai peut être pas bien cherché)
beaucoup d’exemples d’applications écrites en Python. Pouvez-vous m’en
citer ?
J’aurais également désiré connaître votre profil de programmeur ? D’où
venez-vous, pourquoi et pour quelles tâches utilisez-vous Pyhton ?
Utilisez-vous un environnement de développement tel que Boa ?

Merci,
Pierre.

10 réponses

7 8 9 10 11
Avatar
Alex Marandon
chris wrote:
truc a ecrire vite et mal a usage unique => perl


Pour ecrire des petites pages perso éphémeres comme Slashdot ou WikiWikiWeb,
c'est pas mal non plus.

Avatar
Alex Marandon
Olivier Ravard wrote:
C'est vrai que la question initiale était "qui êtes vous et que faites
vous ?" et ça a dévié sur un débat, intéressant par ailleurs, entre python
et ruby.


et Perl :)

Concernant le débat Python/Ruby, je ne poserais que quelques questions, ne
connaissant pas du tout ce langage (Ruby vous avez bien compris):
- existe-t-il des possibilités de développer des modules en C/C++ ?


Oui, comme avec a peu pres tous les langages dignes de ce nom.

- est-il multi plateformes ?


Oui.

Avatar
Alex Marandon
Amaury Forgeot d'Arc wrote:
SoapPy, qui transforme naturellement des appels de fonction vers
XML-RPC;


SoapPy, c'est drolement bien choisi pour une lib XML-RPC.

wxPython qui permet de dériver en Python des objets C++;


En fait, c'est plutot l'inverse. Le fait qu'on puisse deriver des objets C++
en Python permet l'utilisation de toolkits graphiques comme Qt.

py.test pour écrire des tests unitaires sans aucune librairie...


Et py.test, ce serait pas une librairie par hasard ? Ah, un certain Jacques
T. me souffle que ce serait une bibliotheque.

Une fois que cette couche est installée, l'interface devient tellement
naturelle qu'on l'oublie!


Et en plus, pas une seule fuite !

Un regret sur ce sujet: le langage SQL résiste à l'assimilation...


Je me disais bien que ca sonnait pas tres français comme nom, SQL.

Avatar
Bruno Desthuilliers
OK... aux erreurs d'indentation près.


Oui, désolé. Les webmails, c'est assez ch... pour ça.

Avatar
bruno.desthuilliers
On 24 fév, 10:36, Alex Marandon wrote:
Bruno Desthuilliers wrote:
Désolé, j'ai essayé plusieurs fois d'apprendre Perl, je n'ai jama is pu
m'y faire. Idem en shell script et en PHP d'ailleurs.


Pour le PHP, je connais trop peu pour juger, mais ca pas l'air tres robus te,
tant au niveau du langage que de l'interpreteur.


Bin... On a dit "hors concours", je crois, non ?-)

Pour Perl, c'est dommage, c'est un chouette langage, m'enfin on s'en passe
tres bien quand on a Python.

Pour le shell tu dois quand meme bien etre capable d'en lire un peu non ? Ne
serait-ce que pour jeter un oeil aux scripts de demarrages de ton OS.


En lire et en écrire un peu, oui. Mais je trouve ça fatiguant.

C'est pareil en Perl. Les %, @ et $ renseignent juste sur une interfac e,
tu implemente ce que tu veux en dessous ("perldoc perltie" pour en
savoir plus).


Au temps pour moi alors. Ceci étant, je trouve toujours (à titre
personnel et totalement subjectif of course) que ça relève plus de
brouillage que l'information.


Ok, si c'est Python qui le fait, c'est bien, c'est de la genericité, si
c'est Perl, c'est du brouillage d'information ;)


Pardon ? je ne comprends pas ce que tu veux dire, là ???

Oui : le protocole descripteur.

class Foo(object):
def __init__(self, bar):
self.bar = bar

@apply
def bar():
def fget(self):
return self._bar * 2
def fset(self, bar):
self._bar = bar
return property(**locals())


Argh! Mais que sont ces '@' et '**', ciel, des caracteres
non-alphanumeriques, mais c'est illisible !-)


Je n'ai pas dis que les caractères non-alphanumériques étaient
illisibles, j'ai dis que la présence systématique de caractères non-
alphanumériques en début d'identifiant me compliquait la lecture. Tu
vois des @ et des ** au début de chaque identifiant dans le code ci-
dessus ?


Bon donc j'ai lu le 'How-To Guide for Descriptors' (une recherche en Goug le
Francais sur 'protocole descripteur' donne trois resultats qui sont des
articles Usenet d'un certain Bruno Desthuilliers),


Qui c'est ?

c'etait assez stimulant
intellectuellement, je suis pas sur d'avoir tout bien compris, m'enfin
suffisament quand meme pour comprendre ton exemple. Enfin presque, je suis
aussi alle me renseigner sur locals() et me rafraichir la memoire sur
l'operateur **. Enfin, j'ai cherche en vain une reference sur @apply


supprime le @. Le nom de la fonction est 'apply'.

, j'ai
pas trop insiste vu que je suis en mesure de comprendre la version sans
decorateurs


@decorate
def some_func(): pass

n'est qu'un sucre syntaxique pour

def some_func(): pass
some_func = decorate(some_func)

Dans les deux cas, decorate() est un décorateur...


et que tu dis plus bas que c'est deprecié.


apply ? Oui, du moins dans sa vocation première. Mais je trouve ce
petit raccourci bien pratique.

Donc voila, pfiou, tout ca pour ca. Et apres on va dire que Perl est obsc ur.


Si tu trouve ça "obscur", va donc regarder les métaclasses !-)

La simplicité apparente de Python cache effectivement un modèle objet
assez riche et complet, qui permet d'intervenir à pas mal de niveaux.
Donc forcément quelque chose de passablement obscur, du moins à
première vue. Note que personne ne t'oblige à aller mettre le nez
dedans - mais il serait dommage de passer à côté de toute la puissance
du langage. Ceci étant, dans la pratique, la plupart de ces aspects
sont plus utilisés par les développeurs de bibliothèques ou de
frameworks, justement pour rendre le code le plus transparent possible
pour l'utilisateur.

Au final, je pense que je vais garder ma solution a base de __getattr__,
nettement plus lisible, a mon tres subjectif avis.


Dommage pour toi - et pour ceux qui devront maintenir ton code.

Et avant que tu t'emballes, oui, j'ai bien compris que ca permettait pas que
de changer des attributs en valeurs calculées, mais que ca permet aussi de
faire des choses formidables comme des methodes statiques (whaou !)


Pas le plus intéressant, honnêtement.

et des
methodes de classes (dont je ne sais pas a quoi elle peuvent bien servir)


A beaucoup de choses. Entre autres - mais ce n'est qu'un exemple - à
fournir des constructeurs alternatifs... N'oublie pas qu'en Python,
une classe est un objet aussi.

et plein d'autres choses ésoteriques dont sont friands les obfuscateurs
orientés objet pour rendre leur code incomprehensible au programmeur d' en
bas.


Tu ne comprends pas, donc tu dénigres, en somme ?

Dommage. Tous ces mécanismes permettent justement de rendre le code
client plus simple et lisible. Pour ce que ça vaut, Ruby propose
(d'une façon différente) des mécanismes très similaires, grâce
auxquels tout le monde s'extasie sur RoR. Les auteurs de RoR seraient-
ils donc des obfuscateurs orientés objet friands de choses ésotériques
destinées à rendre leur code incompréhensible au programmeur d'en
bas ?-)

Par contre Perl n'est encore une fois pas en reste sur ce point, le nom
du constucteur est completement libre, j'ai choisi new() pour l'exempl e.
Du coup, pour peu que ta factory soit dans le meme package (ce qui ne
veut pas dire dans le meme fichier), elle peut remplacer un constructe ur
sans que le code client soit au courant.


Pas compris...


Bon, j'essaye par l'example alors.

# Creation d'une instance de Aldo et assignation a une variable $objet
my $objet = new Aldo;

# Definition de la classe Aldo
package Aldo;
sub new { return bless {}; }

Le jour ou je veux que new fasse autre que renvoyer une instance de Aldo,
comme par example renvoyer des instances d'autres classes, je modifie le
corps de new et je n'ai pas besoin de modifier le client.


# foo.py
class Foo(object):
pass

class Bar(object):
def __new__(cls):
return Foo()

# client.py
import foo
t = foo.Bar()


Pas besoin de modifier le client non plus...

# On modifie la definition de la classe Aldo
package Aldo;
sub new {
if (...) {
return new Bezu;
} else {
return new Sim;
}

}

Et voila :)


Ok. C'est bien. Et si tu ne veux pas toucher au code de Aldo non plus,
tu fais comment ?-)



Avatar
MC
Bonsoir !


Dans les deux cas, decorate() est un décorateur...


En plus, c'est à la mode ! Il y a même une émission TV là dessus ; ça
s'appelle "DECO"


Stop ! N'en jetez plus, je sors...






--
@-salutations

Michel Claveau

Avatar
Alex Marandon
wrote:
C'est pareil en Perl. Les %, @ et $ renseignent juste sur une
interface, tu implemente ce que tu veux en dessous ("perldoc perltie"
pour en savoir plus).


Au temps pour moi alors. Ceci étant, je trouve toujours (à titre
personnel et totalement subjectif of course) que ça relève plus de
brouillage que l'information.


Ok, si c'est Python qui le fait, c'est bien, c'est de la genericité, si
c'est Perl, c'est du brouillage d'information ;)


Pardon ? je ne comprends pas ce que tu veux dire, là ???


Heu... je ne vois pas trop ce que tu comprends pas. Mais bon c'est pas
grave, je crois qu'on est arrivé au bout de cette question de toute façon.

Bon donc j'ai lu le 'How-To Guide for Descriptors' (une recherche en
Gougle Francais sur 'protocole descripteur' donne trois resultats qui
sont des articles Usenet d'un certain Bruno Desthuilliers),


Qui c'est ?


Aucune idée, mais il a l'air de bien connaitre Python :)

@decorate
def some_func(): pass

n'est qu'un sucre syntaxique pour

def some_func(): pass
some_func = decorate(some_func)

Dans les deux cas, decorate() est un décorateur...


Ok merci.

Donc voila, pfiou, tout ca pour ca. Et apres on va dire que Perl est
obscur.


Si tu trouve ça "obscur", va donc regarder les métaclasses !-)


Ok, j'y penserais :)

Au final, je pense que je vais garder ma solution a base de __getattr__,
nettement plus lisible, a mon tres subjectif avis.


Dommage pour toi - et pour ceux qui devront maintenir ton code.


Pourquoi ? Quels sont les avantages de la solution utilisant le protocole
descripteur ? Elle me parait beaucoup plus lourde, moins lisible, moins
facile à comprendre et à maintenir. L'intervention de NicolasP est
d'ailleurs assez révélatrice.

et plein d'autres choses ésoteriques dont sont friands les obfuscateurs
orientés objet pour rendre leur code incomprehensible au programmeur d'en
bas.


Tu ne comprends pas, donc tu dénigres, en somme ?


Pas du tout, bien au contraire.

Dommage. Tous ces mécanismes permettent justement de rendre le code
client plus simple et lisible. Pour ce que ça vaut, Ruby propose
(d'une façon différente) des mécanismes très similaires, grâce
auxquels tout le monde s'extasie sur RoR. Les auteurs de RoR seraient-
ils donc des obfuscateurs orientés objet friands de choses ésotériques
destinées à rendre leur code incompréhensible au programmeur d'en
bas ?-)


Ça m'étonnerait pas !-)

Par contre Perl n'est encore une fois pas en reste sur ce point, le
nom du constucteur est completement libre, j'ai choisi new() pour
l'exemple. Du coup, pour peu que ta factory soit dans le meme package
(ce qui ne veut pas dire dans le meme fichier), elle peut remplacer un
constructeur sans que le code client soit au courant.


Pas compris...


Bon, j'essaye par l'example alors.

# Creation d'une instance de Aldo et assignation a une variable $objet
my $objet = new Aldo;

# Definition de la classe Aldo
package Aldo;
sub new { return bless {}; }

Le jour ou je veux que new fasse autre que renvoyer une instance de Aldo,
comme par example renvoyer des instances d'autres classes, je modifie le
corps de new et je n'ai pas besoin de modifier le client.


# foo.py
class Foo(object):
pass

class Bar(object):
def __new__(cls):
return Foo()

# client.py
import foo
t = foo.Bar()


Pas besoin de modifier le client non plus...


Arf, on tourne en rond :) Si tu dit que Python fait un truc et que je te dis
que Perl le fait aussi et que tu me redit que Python le fait aussi, ça peut
durer longtemps :)

# On modifie la definition de la classe Aldo
package Aldo;
sub new {
if (...) {
return new Bezu;
} else {
return new Sim;
}

}

Et voila :)


Ok. C'est bien. Et si tu ne veux pas toucher au code de Aldo non plus,
tu fais comment ?-)


Voila, c'est la limite, comme indiqué plus haut.




Avatar
bruno.desthuilliers
On 28 fév, 10:44, Alex Marandon wrote:
wrote:
C'est pareil en Perl. Les %, @ et $ renseignent juste sur une
interface, tu implemente ce que tu veux en dessous ("perldoc perlti e"
pour en savoir plus).


Au temps pour moi alors. Ceci étant, je trouve toujours (à titre
personnel et totalement subjectif of course) que ça relève plus de
brouillage que l'information.


Ok, si c'est Python qui le fait, c'est bien, c'est de la genericité, si
c'est Perl, c'est du brouillage d'information ;)


Pardon ? je ne comprends pas ce que tu veux dire, là ???


Heu... je ne vois pas trop ce que tu comprends pas.


Le rapport entre généricité et $@#%%%

Bon donc j'ai lu le 'How-To Guide for Descriptors' (une recherche en
Gougle Francais sur 'protocole descripteur' donne trois resultats qui
sont des articles Usenet d'un certain Bruno Desthuilliers),


Qui c'est ?


Aucune idée, mais il a l'air de bien connaitre Python :)


Bof...


Au final, je pense que je vais garder ma solution a base de __getattr_ _,
nettement plus lisible, a mon tres subjectif avis.


Dommage pour toi - et pour ceux qui devront maintenir ton code.


Pourquoi ? Quels sont les avantages de la solution utilisant le protocole
descripteur ?


(nb : en l'occurence sous la forme de properties, ce qui n'est qu'une
des applications de ce protocole)

Un premier avantage est que la gestion des accès (get/set/del) est
regroupée par propriété, pas par type d'accès (on voit donc toutes les
'règles' d'une propriété en un même endroit). Un second avantage est
qu'il n'y a pas besoin de toucher __getattr__, __setattr__ etc à
chaque modif (donc moins de risque de casser autre chose au passage).
Un troisième avantage est qu'il est plus facile de remplacer une
property par un autre descripteur. Un quatrième avantage est que la
property (ou autre descripteur) apparait dans le listing des attributs
de l'objet (et peut avoir une docstring). Un cinquième avantage est
que ça évite de devoir modifier les règles de lookup par défaut si on
n'en a pas le besoin. Un sixième avantage est que ça permet de
modifier les règles de lookup si besoin est sans mélanger ça avec les
définitions des properties. Un septième avantage est que le
descripteur (property ou autre) étant un attribut de la classe, on
peut s'en servir dans la métaclasse (très pratique pour des mini (ou
pas mini) frameworks. En cherchant bien, je dois pouvoir en trouver
quelques autres encore...

Elle me parait beaucoup plus lourde,


A quel point de vue ?

moins lisible,


Ah bon ? Tu trouve plus lisible deux fonctions (get/set, on va faire
l'impasse sur del pour le moment) bourrées de if/elif/.... ? les
properties permettent (entre autres) de factoriser cette duplication.

moins
facile à comprendre et à maintenir.


Mon expérience (pour avoir pas mal utilisé __getattr__/__setattr__
avant que les properties n'existent) est que c'est au contraire bien
plus lisible et maintenable.

L'intervention de NicolasP est
d'ailleurs assez révélatrice.


Révélatrice de sa non connaissance des décorateurs, des properties, et
de apply. Honnêtement, la syntaxe que j'utilise n'est pas la plus
courante - même si personnellement je la trouve très lisible. Pour ce
que ça vaut, je pourrais remplacer apply par un décorateur maison
faisant la même chose (voire un peu mieux), mais ça impliquerait une
dépendance supplémentaire.

et plein d'autres choses ésoteriques dont sont friands les obfuscate urs
orientés objet pour rendre leur code incomprehensible au programmeur d'en
bas.


Tu ne comprends pas, donc tu dénigres, en somme ?


Pas du tout, bien au contraire.


Bien au contraire ???

Dommage. Tous ces mécanismes permettent justement de rendre le code
client plus simple et lisible. Pour ce que ça vaut, Ruby propose
(d'une façon différente) des mécanismes très similaires, grâce
auxquels tout le monde s'extasie sur RoR. Les auteurs de RoR seraient-
ils donc des obfuscateurs orientés objet friands de choses ésotér iques
destinées à rendre leur code incompréhensible au programmeur d'en
bas ?-)


Ça m'étonnerait pas !-)


Bon, là c'est de la mauvaise foi caractérisée.

(snip - constructeur en Python et Perl)
Arf, on tourne en rond :) Si tu dit que Python fait un truc et que je te dis
que Perl le fait aussi et que tu me redit que Python le fait aussi, ça peut
durer longtemps :)


Ah, mais c'est que ce second exemple était différent du premier. Ici,
je montrais l'équivalent de ton exemple Perl, qui consiste à
surcharger le constructeur par défaut - ce qui implique une modif de
la classe. Dans l'exemple précédent, je remplaçais l'appel à la cla sse
par un appel à une fonction 'factory' - donc, pas de modif de la
classe elle-même, *ni* des appels dans le code client. Avec un petit
hack sur l'import, c'est transparent ou presque.





Avatar
William Dode
On 28-02-2007, wrote:
On 28 fév, 10:44, Alex Marandon wrote:
wrote:

Au final, je pense que je vais garder ma solution a base de
__getattr__,
nettement plus lisible, a mon tres subjectif avis.


Dommage pour toi - et pour ceux qui devront maintenir ton code.


Pourquoi ? Quels sont les avantages de la solution utilisant le protocole
descripteur ?


(nb : en l'occurence sous la forme de properties, ce qui n'est qu'une
des applications de ce protocole)

Un premier avantage est que la gestion des accès (get/set/del) est
regroupée par propriété, pas par type d'accès (on voit donc toutes les
'règles' d'une propriété en un même endroit). Un second avantage est
qu'il n'y a pas besoin de toucher __getattr__, __setattr__ etc à
chaque modif (donc moins de risque de casser autre chose au passage).
Un troisième avantage est qu'il est plus facile de remplacer une
property par un autre descripteur. Un quatrième avantage est que la
property (ou autre descripteur) apparait dans le listing des attributs
de l'objet (et peut avoir une docstring). Un cinquième avantage est
que ça évite de devoir modifier les règles de lookup par défaut si on
n'en a pas le besoin. Un sixième avantage est que ça permet de
modifier les règles de lookup si besoin est sans mélanger ça avec les
définitions des properties. Un septième avantage est que le
descripteur (property ou autre) étant un attribut de la classe, on
peut s'en servir dans la métaclasse (très pratique pour des mini (ou
pas mini) frameworks. En cherchant bien, je dois pouvoir en trouver
quelques autres encore...


C'est beaucoup plus rapide (en vitesse d'exécution).

--
William Dodé - http://flibuste.net
Développeur informatique indépendant




Avatar
Bruno Desthuilliers
On 28-02-2007, wrote:

On 28 fév, 10:44, Alex Marandon wrote:

wrote:




Au final, je pense que je vais garder ma solution a base de
__getattr__,
nettement plus lisible, a mon tres subjectif avis.


Dommage pour toi - et pour ceux qui devront maintenir ton code.


Pourquoi ? Quels sont les avantages de la solution utilisant le protocole
descripteur ?


(nb : en l'occurence sous la forme de properties, ce qui n'est qu'une
des applications de ce protocole)

Un premier avantage est que la gestion des accès (get/set/del) est
regroupée par propriété, pas par type d'accès (on voit donc toutes les
'règles' d'une propriété en un même endroit). Un second avantage est
qu'il n'y a pas besoin de toucher __getattr__, __setattr__ etc à
chaque modif (donc moins de risque de casser autre chose au passage).
Un troisième avantage est qu'il est plus facile de remplacer une
property par un autre descripteur. Un quatrième avantage est que la
property (ou autre descripteur) apparait dans le listing des attributs
de l'objet (et peut avoir une docstring). Un cinquième avantage est
que ça évite de devoir modifier les règles de lookup par défaut si on
n'en a pas le besoin. Un sixième avantage est que ça permet de
modifier les règles de lookup si besoin est sans mélanger ça avec les
définitions des properties. Un septième avantage est que le
descripteur (property ou autre) étant un attribut de la classe, on
peut s'en servir dans la métaclasse (très pratique pour des mini (ou
pas mini) frameworks. En cherchant bien, je dois pouvoir en trouver
quelques autres encore...



C'est beaucoup plus rapide (en vitesse d'exécution).



Effectivement:

playground $ python benchprop.py
property: [11.554224014282227, 11.45815896987915, 11.630644083023071]
get/setattr: [18.331769943237305, 18.211669921875, 18.350566864013672]

playground $ cat benchprop.py
class Toto(object):
def __init__(self, name):
self.name = name

@apply
def name():
def fget(self):
return self._name
def fset(self, name):
self._name = name.lower()
return property(**locals())

class Tutu(object):
def __init__(self, name):
self.name = name

def __getattr__(self, name):
if name == 'name':
return self._name
raise AttributeError("")

def __setattr__(self, name, value):
if name == 'name':
self.__dict__['_name'] = value.lower()
else:
object.__setattr__(self, name, value)

toto = (
"t = Toto('toto');t.name = 'TOTO';_ = t.name;",
"from __main__ import Toto"
)

tutu = (
"t = Tutu('tutu');t.name = 'TUTU';_ = t.name;",
"from __main__ import Tutu"
)

from timeit import Timer
print "property:", Timer(*toto).repeat()
print "get/setattr:", Timer(*tutu).repeat()





7 8 9 10 11