Explorer l'ellipse de Python (…) : plus que du sucre de syntaxe
Vous êtes-vous déjà demandé à quoi servent les trois points (...) en Python ? Découvrez comment cet opérateur puissant peut simplifier votre code !
Python, un langage connu pour sa puissance, recèle quelques joyaux cachés qui n’ont pas toujours l’importance qu’il mérite. Conformément au sujet, nous affirmons que les points de suspension sont l'une de ces fonctionnalités, avec des utilisations que les programmeurs ne connaissent généralement pas. En termes simples, les points de suspension sont un symbole à trois points utilisé comme espace réservé pour mettre en évidence le code inachevé ou les zones dans lesquelles des travaux futurs sont prévus. Les points de suspension facilitent le découpage des tableaux multidimensionnels et sont utiles pour les indications de type. Par conséquent, nous pouvons dire que les points de suspension sont un outil qui peut améliorer le code, permettant un code plus organisé tout en simplifiant les opérations complexes.
Vous n'avez pas besoin d'importer les points de suspension pour l'utiliser. Allons maintenant plus loin pour comprendre ce que les points de suspension ont à offrir.
1. Points de suspension comme espace réservé
Généralement en anglais, trois points signalent la suite ou représentent des parties sautées. De même, en Python, les points de suspension peuvent agir comme un support pour du code qui n'a pas été implémenté jusqu'à présent. Cette approche est particulièrement utile lorsque vous structurez des fonctions, des classes ou même des modules entiers, vous permettant de laisser des parties du code vides sans provoquer d'erreurs de syntaxe.
Par exemple, si vous concevez un programme et connaissez la structure du code mais n'avez pas encore écrit toute la logique, vous pouvez utiliser ... pour indiquer l'endroit où le code ira finalement :
def classify():
...
Dans ce contexte, les points de suspension agissent comme un marqueur « à faire », indiquant qu'il y a encore du travail à faire. Contrairement à pass, qui agit comme un espace réservé sans opération, l'utilisation de ... (les points de suspension) indique qu'une fonction est intentionnellement incomplète.
2. Points de suspension dans le découpage de tableaux multidimensionnels
L'opérateur points de suspension en Python est un outil précieux pour le découpage de tableaux, en particulier dans les bibliothèques comme NumPy où la gestion de tableaux multidimensionnels peut devenir complexe. Considérons un tableau 3D dans lequel vous souhaitez sélectionner tous les éléments des deux premières dimensions tout en récupérant les éléments à l'index 0 de la dernière dimension. En utilisant l'opérateur points de suspension, vous pouvez le faire avec :
import numpy as np
# Create a 3D array
arr = np.arange(27).reshape(3, 3, 3)
# Select all elements along the first two dimensions and only index 0 of the last dimension
result = arr[..., 0]
print(result)
Output
[[ 0 3 6]
[ 9 12 15]
[18 21 24]]
Le arr[..., 0] sélectionne tous les éléments le long des deux premières dimensions tout en se concentrant uniquement sur l'index 0 dans la troisième dimension. Cette approche rend la manipulation de données de grande dimension efficace et améliore la clarté du code lorsque vous travaillez avec de grands ensembles de données.
3. Points de suspension dans les valeurs des paramètres par défaut
Les points de suspension (...) peuvent également être utilisés comme valeur de paramètre par défaut unique dans les fonctions Python, offrant une alternative utile lorsque None pourrait être un argument valide. En utilisant ... par défaut, vous pouvez clairement distinguer les cas où aucun argument n'a été fourni et les cas où None est intentionnellement transmis comme valeur.
Comprenons-le à l’aide d’un exemple :
def greet(name="Guest", greeting=...):
if greeting is ...:
greeting = "Hello" # Default greeting if none provided
print(f"{greeting}, {name}!")
# Testing different cases
greet("Alice") # Uses default greeting: "Hello, Alice!"
greet("Bob", greeting="Hi") # Custom greeting: "Hi, Bob!"
greet("Charlie", greeting=None)
# Outputs: "None, Charlie!" (explicitly setting greeting to None)
Dans cet exemple :
- Si aucun message d'accueil n'est fourni, la valeur par défaut est "Bonjour".
- Si un message d'accueil spécifique est fourni (comme « Bonjour »), la fonction l'utilise à la place du message par défaut.
- Si Greeting=None, il affiche "Aucun, {nom}!", indiquant que None a été transmis volontairement, contrairement à l'utilisation de la valeur par défaut.
4. Points de suspension comme indices de type
Les points de suspension (...) peuvent être utilisés comme indices de type, en particulier dans certains contextes où vous souhaitez indiquer que davantage de valeurs pourraient être présentes ou que quelque chose a une structure de variable qui n'est pas entièrement spécifiée. Voici les deux utilisations différentes des points de suspension comme indices de type dont nous allons discuter :
Pour les tuples de longueur inconnue
Les indices de type sont utilisés pour représenter des éléments flexibles ou ayant des caractéristiques non spécifiées. Imaginez si vous souhaitez créer une variable appelée spice_list qui est un tuple de chaînes, mais vous ne savez pas combien de chaînes contiendront ce tuple. Ellipsis garantit que tous les éléments sont des chaînes tout en permettant au nombre d'éléments de varier.
Code Example:
from typing import Tuple
# Allowed:
grocery_list: Tuple[str, ...] = ("apples", "bread", "milk", "eggs", "butter")
grocery_list = ("apples",) # A tuple with a single string is allowed
grocery_list = () # An empty tuple is allowed
# Not allowed:
grocery_list = (1, "bread")
grocery_list = ["apples", "bread"]
grocery_list = ("apples", 2.5)
# Function to print each item in the grocery list
def print_grocery_items(items: Tuple[str, ...]) -> None:
for item in items:
print(f"- {item}")
# Call the function with our grocery list
print_grocery_items(grocery_list)
La définition de variable comme grocery_list : Tuple[str, ...]=("apples", "bread") est valide car les deux éléments sont du type spécifié, tandis que les types mixtes comme ( 1, "bread") ou une liste au lieu d'un tuple ["apples", "bread"] ne sont pas autorisés.
Pour les callables avec des arguments flexibles
Les points de suspension peuvent être utilisés dans les indications de type pour les appelables lorsque le nombre et les types d'arguments sont inconnus. Parfois, vous devrez peut-être passer une fonction à une autre fonction sans savoir quels seront les arguments de cette fonction. Les points de suspension peuvent donc être utilisés pour montrer que la fonction peut prendre un nombre facultatif d’arguments de n’importe quel type.
Code Example:
from typing import Callable
# A function that takes one number and returns it doubled
def double_value(x: int) -> int:
return x * 2
# A function that takes two numbers and returns their sum
def add_values(x: int, y: int) -> int:
return x + y
# A function that takes an integer, a callable, and optional extra arguments
def apply_action(value: int, action: Callable[..., int], *args: int) -> int:
return action(value, *args)
# Allowed:
print(apply_action(5, double_value)) # Calls double_value(5), which results in 10
print(apply_action(5, add_values, 3)) # Calls add_values(5, 3), which results in 8
# Not Allowed:
apply_action(5, 3)
apply_action(5, double_value, "extra")
Dans l'exemple ci-dessus,
- La fonction apply_action prend un entier (valeur), un appelable (action) et des arguments supplémentaires facultatifs (*args).
- L'indice de type Callable[..., int] signifie que l'action appelable peut prendre n'importe quel nombre d'arguments de n'importe quel type, mais elle doit renvoyer un int.
- La fonction apply_action peut gérer les deux scénarios de fonctions double_value et add_values en raison des points de suspension (...) dans l'indice de type.
- Les exemples qui ne fonctionnent pas soulignent que l'appelable doit être une fonction et que les arguments supplémentaires doivent correspondre au type d'entrée attendu de la fonction.
Cela maintient la cohérence du type tout en offrant une flexibilité dans les arguments transmis à l'appelable.