.clone() ou __deepcopy__() ?

.clone() ou __deepcopy__() ? - Python - Programmation

Marsh Posté le 15-11-2013 à 14:31:01    

S'agissant de la copie "profonde" d'un objet, qu'est-ce qui est le plus clair pour la lisibilité du code ? Pour chaque classe, définir une fonction clone() ou une fonction __deepcopy__() ?
 
Il me semble que __deepcopy__ serait peut-être plus conforme à l'esprit Python mais oblige à appeler copy.deepcopy(obj) qui masque l'existence de la fonction __deepcopy__() : après tout, si une telle fonction n'existe pas, Python bascule sur la fonction deepcopy() générique.
 
Avec une fonction .clone(), c'est l'inverse : l'existence de cette fonction saute aux yeux mais elle contourne le traditionnel appel à copy.deepcopy().
 
Qu'en pensez-vous ? Merci !


---------------
rule #1 : trust the python
Reply

Marsh Posté le 15-11-2013 à 14:31:01   

Reply

Marsh Posté le 15-11-2013 à 17:11:54    

La lisibilité d'un code n'est pas en rapport avec le nom d'une méthode de classe.
 
la méthode __deepcopy__ , si elle est existante à un rôle bien déterminé, là modifier voudrait dire la surcharger et changer sa fonction naturelle, dans ce cas, je préfèrerais utiliser la méthode clone(...).
 
Dans le cas où la méthode __deepcopy__ n'existe pas pour l'objet, on peut naturellement l'ajouter et modifier l'état d'un objet, seulement attention, l'objet python n'utilisant pas cette méthode en mode standard veut sans doute dire quelque chose et dans ce cas, il est fort possible que la méthode que tu appelles __deepcopy__ ne fait pas la fonction qu'elle devrait faire. Ça serait dans ce cas une erreur de conception...

Reply

Marsh Posté le 18-11-2013 à 09:12:37    

Merci pour cette réponse. En creusant la question, j'ai cru comprendre que .clone() était à utiliser à chaque fois que l'on travaillait sur un type connu, c'est-à-dire quasiment tout le temps, deepcopy() étant réservé au cas où l'on doit dupliquer un objet dans le type est mal connu, voire complètement inconnu. Je trouve cette distinction un peu curieuse pour Python où l'introspection permet d'avoir toutes les informations possibles mais j'imagine qu'il y a des cas (pickling ? projet trop gros et mal documenté ?) où deepcopy() est la seule méthode possible.


---------------
rule #1 : trust the python
Reply

Marsh Posté le 18-11-2013 à 11:49:01    

Bonjour,
 

Citation :

En creusant la question, j'ai cru comprendre que .clone() était à utiliser à chaque fois que l'on travaillait sur un type connu, c'est-à-dire quasiment tout le temps, deepcopy() étant réservé au cas où l'on doit dupliquer un objet dans le type est mal connu


 
Qui a dit cela ? Source ?
 

Citation :

Je trouve cette distinction un peu curieuse pour Python où l'introspection permet d'avoir toutes les informations possibles mais j'imagine qu'il y a des cas (pickling ? projet trop gros et mal documenté ?) où deepcopy() est la seule méthode possible.


 
Dans quelle application utiliseriez-vous __deepcopy__ ?
 

Citation :

j'ai cru comprendre que .clone() était à utiliser à chaque fois que l'on travaillait sur un type connu


 
Encore une fois, d'où vient tout ces dires ?
 
Quand on conçoit un code, qu'il est bien ficelé, tout est possible, même l'interdit, car ce qui compte c'est le besoin du client... Encore faut-il qu'il soit bien ficelé, c'est une autre paire de manches !

Reply

Marsh Posté le 18-11-2013 à 12:02:26    

Bonjour - merci de vos réponses -
je me suis largement inspiré d'un poste (http://www.quora.com/Python-progra [...] -deep-copy) qui condamnait l'emploi de deepcopy().
 
Qu'en pensez-vous ?


---------------
rule #1 : trust the python
Reply

Marsh Posté le 18-11-2013 à 12:49:47    

L'utilisation de __deepcopy__ se généralise pour toutes les surcharges, on surcharge selon les besoins, mais à partir du moment où on hérite d'un objet connu, on fait attention à ce qu'on fait, car on dénaturalise l'objet et certaines méthodes pourraient être inutilisables, dans ce cas la solution souhaitée lors d'un héritage est la création d'une nouvelle méthode comme clone() par exemple...

 


Message édité par fred1599 le 18-11-2013 à 12:50:37
Reply

Sujets relatifs:

Leave a Replay

Make sure you enter the(*)required information where indicate.HTML code is not allowed