top pour quelqu'un gotchas mouvement d'une statique lang (java / c #) au langage dynamique comme Python

StackOverflow https://stackoverflow.com/questions/3703704

  •  02-10-2019
  •  | 
  •  

Question

Quelles sont les meilleures pour quelqu'un gotchas passer d'une statique lang (java / c #) au langage dynamique comme Python?

Il semble fraîche comment les choses peuvent être faites, mais renommer une méthode, ou l'ajout / suppression des paramètres semble si risqué!

La seule solution à des tests d'écriture pour chaque méthode?

Était-ce utile?

La solution

Je dirais que le numéro un Gotcha tente d'écrire du code statiquement typé dans un langage dynamique.

Ne pas hésité à utiliser un identificateur pour pointer vers une chaîne de caractères et une liste de sections autonomes du code

keys = 'foo bar foobar' # Imagine this coming in as an argument
keys = keys.split() # Now the semantically chose name for the argument can be 
                    # reused As the semantically chosen name for a local variable

ne hésitez pas à traiter des fonctions comme valeurs régulières: ils sont. Prenez l'analyseur suivant. Supposons que nous voulons traiter tous les tags d'en-tête des étiquettes semblables et ul comme des balises ol.

class Parser(HTMLParser):
    def __init__(self, html):
        self.feed(html)

    def handle_starttag(self, tag, attrs):
        parse_method = 'parse_' + tag    
        if hasattr(self, parse_method):  
            getattr(self, parse_method)(attrs)


    def parse_list(self, attrs):
        # generic code

    def parse_header(self, attrs):
       # more generic code

    parse_h1 = parse_h2 = parse_h3 = parse_h4 = parse_h5 = parse_h6 = parse_header
    parse_ol = parse_ul = parse_list

Cela pourrait se faire en utilisant moins de code générique dans la méthode handle_starttag dans un langage comme Java en gardant la trace des balises carte à la même méthode mais si vous décidez que vous voulez gérer des balises div, vous devez ajouter que dans la logique de répartition. Ici, vous ajoutez juste la méthode parse_div et vous êtes bon pour aller.

Ne pas typecheck! Canard type!

def funtion(arg):
    if hasattr(arg, 'attr1') and hasattr(arg, 'attr2'):
         foo(arg):
    else:
         raise TypeError("arg must have 'attr1' and 'attr2'")

par opposition à isinstance(arg, Foo). Cela vous permet de passer dans un objet avec attr1 et attr2. Cela vous permet de passer de l'instance dans une classe de traçage enroulé autour d'un objet à des fins de débogage. Vous devez modifier la classe pour faire en Java AFAIK.

Comme l'a souligné THC4k, un autre (plus pythonique) façon de le faire est le PAEF idiome. Je ne aime pas parce que j'aime les erreurs de prises le plus tôt possible. Il est plus efficace si vous vous attendez pour le code à l'échec rarement bien. Ne dites à personne que je ne l'aime pas mais ils nous arrêter de penser que je sais comment écrire python. Voici un exemple avec la permission de THC4k.

try: 
    foo(arg): 
except (AttributeError, TypeError): 
    raise InvalidArgumentError(foo, arg)

Il est un tossup quant à savoir si nous devrions attraper le AttributeError et TypeError ou tout simplement les laisser se propager quelque part qui sait comment les gérer, mais cela est juste un exemple que nous allons laisser voler.

Autres conseils

  

"La seule solution à des tests d'écriture pour chaque méthode?"

Vous vous dites n'a pas tests d'écriture pour chaque méthode en Java?

Si vous avez écrit des tests pour chaque méthode en Java, puis - bien - rien ne change, il ne

  

renommer une méthode, semble si risqué!

Correct. Ne pas le faire.

  

Ajout / suppression de paramètres semble si risqué!

Quoi? Parlez-vous des paramètres facultatifs? Si oui, alors avoir plusieurs noms surchargés en Java semble risqué et déroutant. Des paramètres optionnels semble plus simple.


Si vous effectuez une recherche sur le SO pour la plupart des questions Python communes, vous verrez que certaines choses sont des questions chroniques.

  • Comment mettre à jour le PYTHONPATH.

  • Pourquoi un calcul à virgule flottante aléatoire n'est pas la même chose qu'une abstraction mathématique pourrait indiquer.

  • Utilisation de Python 3 et le code de frappe à partir d'un tutoriel Python 2.

  • Pourquoi Python n'a pas protected super-complexes, les déclarations de private et public.

  • Pourquoi Python ne dispose pas d'un type ENUM.

Le problème chronique # 1 semble utiliser des objets modifiables comme valeurs par défaut pour une fonction. Il suffit d'éviter cela.

Il y a des choses qui m'a frappé lors de la première essayer Python (principalement en provenance d'un arrière-plan Java):

  1. Ecrire Pythonic code. Utilisez idiomes recommandés pour Python, plutôt que de le faire à l'ancienne Java / C. Ceci est plus qu'un simple problème cosmétique ou dogmatique. Code pythonique est en fait extrêmement rapide dans la pratique que C-comme le code pratiquement tout le temps. En fait, à mon humble avis beaucoup de « Python est lent » notion flottante est autour du fait que les codeurs inexpérimentés ont essayé de code Java / C en Python et a fini par prendre un grand succès de la performance et ont eu l'idée que Python est lent horriblement. Liste d'utilisation compréhensions et carte / filtre / réduire autant que possible.

  2. Familiarisez-vous avec l'idée que les fonctions sont des objets vraiment. Faites-les circuler comme callbacks, les fonctions de faire revenir les fonctions, informez-vous sur les fermetures etc.

  3. Il y a beaucoup de fraîcheur et presque magique des choses que vous pouvez faire en Python comme renommer les méthodes que vous mentionnez. Ces choses sont grands pour montrer les caractéristiques de Python, mais vraiment pas nécessaire si vous ne les avez pas besoin. En effet, comme S. Lott a souligné, de son mieux pour éviter les choses qui semblent risquées.

Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top