Maîtrisez le type avec Python? (Quand faire la vérification de type)

À l'origine, je l'ai écrit dans le commentaire de l'article suivant, mais je pensais que c'était trop agressif pour l'écrire dans le commentaire, alors je l'ai déplacé ici. Maîtriser les types avec Python [compatible Python 3.9]

C'est un article bien connu qu'il ne fera que provoquer une controverse religieuse.

Récemment, les avantages du typage statique (ou les inconvénients du typage dynamique?) Sont devenus populaires, et TypeScript est devenu populaire, et même Python peut effectuer une vérification de type statique. Cependant, je fais personnellement un "typage inutile" (dans certains cas, plutôt "un typage potentiellement dangereux") (en particulier dans la fonction de vérification de type statique qui a été ajoutée plus tard au langage de typage dynamique). J'ai l'impression que le code augmente.

Maîtriser les types avec Python [compatible Python 3.9] Dans l'article

def add(a, b):
    """Renvoie le résultat de l'ajout d'arguments"""
    return a + b

Avec un moule

def add_type(a: int, b: int) -> int:
    """Renvoie le résultat de l'ajout d'arguments"""
    return a + b

Un exemple apparaîtra.

Cependant, dans cet exemple, je pense que le type ne doit pas être écrit ***. Il n'est pas bon de spécifier le type inutilement. Dans ce cas, tout type qui a du sens pour l'opération ʻa + b` fera l'affaire, et je pense que c'est un "mauvais" style de programmation de spécifier int. Bien sûr, je comprends que ce qui précède n'est qu'un exemple, mais je pense toujours que cet exemple est "inapproprié comme exemple".

Dans quels cas est-il gênant de spécifier> int?

Après avoir compris que la réalité ne suffit pas avec la théorie idéale, si vous parlez de théorie idéale,

*** Doit être programmé pour les interfaces, pas pour les types de béton ***

C'est pourquoi.

Dans cet exemple, la fonction ʻadd est applicable à tout objet qui a la propriété (interface) qu'il peut être ajouté avec l'opérateur + ʻopérateur. Bien entendu, le traitement spécifique effectué par l'opérateur + diffère selon chaque type spécifique (polymorphisme), mais la fonction ʻadd est programmée pour "l'interface" appelée l'opérateur + ʻopérateur. Par conséquent, je ne connais pas le contenu de traitement spécifique de l'opérateur «+» (ou plutôt, il ne devrait pas dépendre du contenu de traitement spécifique de l'opérateur «+» ***). C'est pourquoi.

Dans cet exemple, vous ne devez pas être lié au type concret ʻint. Ensuite, si vous voulez le changer en float au lieu de ʻint plus tard, vous devez remplacer tous les mots-clés ʻint du programme par float`. Sera.

D'ailleurs, je ne pense pas qu'il soit nécessaire de restreindre les arguments de la fonction ʻadd à des valeurs numériques. L'argument de la fonction ʻadd n'a besoin que d'avoir une interface appelée l'opérateur + défini, donc la fonction ʻadd définit la str, list, et même la méthode spéciale add. Il n'y a rien de mal à entrer dans votre propre classe. Pour être plus précis, en premier lieu, la fonction ʻadd est *** should *** qui est écrite pour fonctionner avec n'importe quel objet qui a l'opérateur +.

En fait, de nos jours, dans le monde des langages à typage statique (en particulier en C ++ et Rust), je ne tape pas autant que possible (laissez le compilateur déduire automatiquement le type), et même si j'ose taper, c'est aussi générique que possible. Le style de programmation de la création d'un type se répand.

D'un autre côté, récemment, je suis venu voir du code qui est tapé en Python, mais je me demande souvent pourquoi un tel "typage inutile" est fait. Pour être honnête, vous avez l'impression de regarder "du code C ++ vieux de 30 ans". Les programmeurs Python vont-ils recommencer les 30 dernières années d'essais et d'erreurs (et le changement de paradigme qui en résulte) dans le monde des langages statiquement typés? J'ai pensé.

Écrire ceci peut tout à fait conduire à une guerre religieuse, mais dans mon "parti pris", les gens qui veulent taper en Python sont ceux qui sont nouveaux sur Python (ou C ++ il y a 20-30 ans). Ceux qui se sont arrêtés à la connaissance de Java), mais plutôt ceux qui sont récemment passés des langages à typage statique à Python, ont l'impression qu'ils sont réticents à taper en Python.

Recommended Posts

Maîtrisez le type avec Python? (Quand faire la vérification de type)
Vérifiez le comportement lors de l'attribution de Python
Maîtriser le type avec Python [compatible Python 3.9]
Maîtriser le module lowref en Python
Soyez prudent lorsque vous spécifiez la valeur d'argument par défaut dans la série Python 3
Que faire lorsque le type de valeur est ambigu en Python?
Vérifiez le comportement du destroyer en Python
Vérifiez si l'URL existe en Python
Vérifiez si les caractères sont similaires en Python
Enquête lorsque l'importation ne peut pas être effectuée avec python
Python # Vérifier l'identité du type
Vérifiez si la chaîne est un nombre en python
Remarque Python: lorsque la commande pip ne peut pas être utilisée
Paramètres initiaux lors de l'utilisation de l'API foursquare avec python
Lorsque l'importation matplotlib.pyplot ne peut pas être effectuée dans l'environnement pyenv-virtualenv
Vérifiez la nature atrophique de la distribution de probabilité en Python
J'ai vérifié la vitesse de référence lors de l'utilisation de la liste python, du dictionnaire et du type de jeu.
Quand les arguments par défaut seront-ils liés en python? Lorsque les variables sont liées dans l'évaluation différée de la fermeture.
[python] Comment vérifier si la clé existe dans le dictionnaire
Vérifiez le fonctionnement de Python pour .NET dans chaque environnement
Trouver des erreurs en Python
Solution lorsque l'image ne peut pas être affichée avec tkinter [python]
Python - Vérifiez le type de valeurs
Vérifiez à l'avance ce qui se passe lorsque la commande est exécutée
Attention lorsque os.mkdir en Python
Résolvez le problème japonais lors de l'utilisation du module CSV en Python.
Scripts pouvant être utilisés lors de l'utilisation de Bottle en Python
Cochez le bouton Vérifier dans Tkinter pour autoriser la modification de l'entrée
[Python] Vérifiez les bibliothèques installées
Une raison simple pour laquelle la valeur de retour de round (2.675,2) est de 2,67 en python (elle devrait être de 2,68 en réalité ...)
Vérifiez si le hachage de mot de passe généré par PHP correspond en Python
J'ai eu un AttributeError en me moquant de la méthode ouverte en python
Ligne de mode lorsque vous ouvrez le code Python approprié dans Vim
Comment vérifier la taille de la mémoire d'une variable en Python
Un enregistrement que GAMEBOY n'a pas pu être fait avec Python. (PYBOY)
33 chaînes à ne pas utiliser comme noms de variables en python
Spécification du fuseau horaire lors de la conversion d'une chaîne de caractères en type datetime avec python
Comment vérifier la taille de la mémoire d'un dictionnaire en Python
Jupyter Notebook 6.0.2 ne peut pas être installé dans l'environnement Python 2.7 créé dans Anaconda
Assurez-vous que python peut convertir / convertir une chaîne de caractères en int
N'oubliez pas shebang lors de l'écriture de l'inventaire dynamique d'Ansible en python!
Rechercher les fuites de mémoire dans Python
Obtenir l'API arXiv en Python
Rechercher des commandes externes avec python
Précautions lors de l'utilisation de Pit avec Python
Définition du type d'argument de fonction en python
Enregistrez le fichier binaire en Python
Frappez l'API Sesami en Python
Comportement lors de la liste dans Python heapq
Obtenez le chemin du bureau en Python
Charger dynamiquement les types json avec python
Obtenez le chemin du script en Python
Dans la commande python, python pointe vers python3.8
Implémenter le modèle Singleton en Python
Type spécifié en python. Lancer des exceptions
Vérifiez et déplacez le répertoire en Python
[Python] Soyez prudent lorsque vous utilisez print
Accédez à l'API Web en Python
Vérifiez le résumé des données dans CASTable