62 votes

En tant que programmeur Java apprenant Python, à quoi dois-je faire attention ?

La plupart de mes connaissances en matière de programmation sont en Java, et je continue à faire la plupart de mes programmes en Java. Cependant, je commence à apprendre Python pour certains projets parallèles au travail, et j'aimerais l'apprendre aussi indépendamment que possible de mes connaissances en Java - c'est-à-dire que je ne veux pas simplement programmer Java en Python. Quelles sont les choses auxquelles je dois faire attention ?

Un exemple rapide : en parcourant le tutoriel Python, j'ai découvert que les paramètres mutables par défaut d'une fonction (comme une liste) sont persistants (mémorisés d'un appel à l'autre). En tant que programmeur Java, j'ai trouvé cela contre-intuitif et j'ai eu du mal à m'y retrouver. (Voir aquí y aquí si vous ne comprenez pas l'exemple).

Quelqu'un m'a aussi fourni este que j'ai trouvée utile, mais courte. Quelqu'un a-t-il d'autres exemples de la façon dont un programmeur Java pourrait avoir tendance à mal utiliser Python ? Ou des choses qu'un programmeur Java pourrait supposer à tort ou avoir du mal à comprendre ?

Editar : Ok, un bref aperçu des raisons abordées par l'article dont j'ai fait le lien pour éviter les doublons dans les réponses (comme suggéré par Bill le Lézard). (S'il vous plaît, faites-moi savoir si je fais une erreur de formulation, je n'ai fait qu'une seule réponse. juste J'ai commencé avec Python, donc je ne comprends peut-être pas tous les concepts. Et un avertissement - ceci va être très bref, donc si vous ne comprenez pas où il veut en venir, consultez le lien).

  • Une méthode statique en Java ne se traduit pas par une classmethod en Python.
  • Une instruction switch en Java se traduit par une table de hachage en Python.
  • N'utilisez pas le XML
  • Les récupérateurs et les régleurs sont mauvais (hé, je ne fais que citer :) )
  • La duplication du code est souvent un mal nécessaire en Java (par exemple, la surcharge des méthodes), mais pas en Python.

(Et si vous trouvez cette question un tant soit peu intéressante, allez quand même voir le lien :) C'est assez bon).

25voto

Ryan Ginstrom Points 8354
  • Ne mettez pas tout dans les classes . Les listes et dictionnaires intégrés de Python vous mèneront loin.
  • Ne vous souciez pas de garder une classe par module. . Divisez les modules par objectif, et non par classe.
  • Utiliser l'héritage pour le comportement, pas pour les interfaces . Ne créez pas une classe "Animal" dont "Chien" et "Chat" hériteraient, juste pour avoir une méthode générique "make_sound".

Fais juste ça :

class Dog(object):
    def make_sound(self):
        return "woof!"

class Cat(object):
    def make_sound(self):
        return "meow!"

class LolCat(object):
    def make_sound(self):
        return "i can has cheezburger?"

23voto

S.Lott Points 207588

L'article cité en référence contient quelques bons conseils qui peuvent facilement être mal cités et mal compris. Et quelques mauvais conseils.

Laissez Java derrière vous. Prenez un nouveau départ. "Ne vous fiez pas à vos instincts [basés sur Java]". Dire que les choses sont "contre-intuitives" est une mauvaise habitude dans toute discipline de programmation. Lorsque vous apprenez un nouveau langage, prenez un nouveau départ et laissez tomber vos habitudes. Votre intuition debe avoir tort.

Les langues sont différents . Sinon, ce serait la même langue avec une syntaxe différente, et il y aurait des traducteurs simples. Comme il n'y a pas de traducteurs simples, il n'y a pas de correspondance simple. Cela signifie que l'intuition est inutile et dangereuse.

  • "Une méthode statique en Java ne se traduit pas par une classmethod en Python." Ce genre de choses est vraiment limité et peu utile. Python possède un Méthode statique décorateur. Il dispose également d'un méthode de classe pour lequel Java n'a pas d'équivalent.

    Ce point, BTW, comprenait également le conseil beaucoup plus utile de ne pas envelopper inutilement tout dans une classe. "La traduction idiomatique d'une méthode statique Java est généralement une fonction de niveau module".

  • Le Java switch en Java peut être implémentée de plusieurs façons. Tout d'abord, et avant tout, il s'agit généralement d'une instruction if elif elif elif construire. L'article n'est pas utile à cet égard. Si vous êtes absolument sûr que c'est trop lent (et que vous pouvez le prouver), vous pouvez utiliser un dictionnaire Python comme correspondance légèrement plus rapide entre une valeur et un bloc de code. Passer aveuglément du switch au dictionnaire (sans réfléchir) est un très mauvais conseil.

  • N'utilisez pas le XML. Cela n'a pas de sens si on le sort du contexte. Dans le contexte, cela signifie qu'il ne faut pas compter sur le XML pour ajouter de la flexibilité. Java s'appuie sur la description de choses en XML ; les fichiers WSDL, par exemple, répètent des informations qui sont évidentes en inspectant le code. Python s'appuie sur l'introspection au lieu de tout reformuler en XML.

    Mais Python dispose d'excellentes bibliothèques de traitement XML. Plusieurs.

  • Les récupérateurs et les régleurs ne sont pas requis en Python comme ils sont requis en Java. Premièrement, l'introspection est meilleure en Python, et vous n'avez donc pas besoin de getters et setters pour créer des objets bean dynamiques. (Pour cela, vous utilisez collections.namedtuple ).

    Cependant, vous avez le propriété qui regroupera les getters (et setters) dans une construction de type attribut. L'idée est que Python préfère les attributs nus ; lorsque cela est nécessaire, nous pouvons regrouper les getters et les setters pour qu'ils apparaissent comme s'il y avait un simple attribut.

    De plus, Python dispose de classes de descripteurs si les propriétés ne sont pas assez sophistiquées.

  • La duplication du code est souvent un mal nécessaire en Java (par exemple, la surcharge des méthodes), mais pas en Python. Correct. Python utilise des arguments optionnels au lieu de la surcharge des méthodes.

    La puce parle ensuite de la fermeture, ce qui n'est pas aussi utile que le simple conseil d'utiliser à bon escient les valeurs des arguments par défaut.

14voto

John Y Points 5475

Une chose à laquelle vous êtes peut-être habitué en Java et que vous ne trouverez pas en Python est la stricte confidentialité. Il ne s'agit pas tant d'une chose à laquelle il faut faire attention que d'une chose à laquelle il faut faire attention. no (Je suis embarrassé par le temps que j'ai passé à chercher l'équivalent de "private" en Python à mes débuts !) Au contraire, Python offre beaucoup plus de transparence et une introspection plus facile que Java. Cela relève de ce qui est parfois décrit comme la philosophie "nous sommes tous des adultes consentants". Il existe quelques conventions et mécanismes de langage qui permettent d'éviter les problèmes suivants accidentel l'utilisation de méthodes "non publiques", etc., mais l'idée de cacher des informations est pratiquement absente de Python.

10voto

dsimcha Points 32831

La plus importante à laquelle je pense est de ne pas comprendre ou de ne pas utiliser pleinement la dactylographie des canards. En Java, vous devez spécifier des informations de type très explicites et détaillées dès le départ. En Python, le typage est à la fois dynamique et largement implicite. La philosophie est que vous devriez penser à votre programme à un niveau plus élevé que les types nominaux. Par exemple, en Python, on n'utilise pas l'héritage pour modéliser la substituabilité. La substituabilité est fournie par défaut en tant que résultat du typage des canards. L'héritage n'est qu'une commodité du programmeur pour réutiliser l'implémentation.

De même, l'idiome pythonique est "demande pardon, ne demande pas la permission". Le typage explicite est considéré comme un mal. Ne vérifiez pas si un paramètre est un certain type à l'avance. Essayez simplement de faire ce que vous avez besoin de faire avec le paramètre. S'il ne se conforme pas à l'interface appropriée, une exception très claire sera levée et vous pourrez trouver le problème très rapidement. Si quelqu'un passe un paramètre d'un type qui était nominalement inattendu mais qui a la même interface que ce que vous attendiez, alors vous avez gagné en flexibilité gratuitement.

7voto

cjrh Points 3960

La chose la plus importante, du point de vue de Java, est qu'il est parfaitement acceptable de ne pas créer de classes pour tout. Il existe de nombreuses situations où une approche procédurale est plus simple et plus courte.

La prochaine chose la plus importante est que vous devrez dépasser l'idée que la type d'un objet contrôle ce qu'il peut faire ; au contraire, la code contrôle ce que les objets doivent pouvoir supporter au moment de l'exécution (ceci en vertu de la typographie des canards).

Oh, et utilisez autant que possible des listes et des dicts natifs (et non des descendants personnalisés).

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