Aller au contenu

Types supplémentaires de Python 3.15

La version 3.15 de Python ajoute les deux types suivants. Les exemples de cette section ne fonctionnent pas avec les versions antérieures.

frozendict() : construire un dictionnaire immuable

frozendict() permet de construire un dictionnaire dont les associations ne peuvent plus être modifiées après la création.

settings = frozendict(environment="production", retries=3)
print(settings["retries"])  # 3

Equivalent en C#

var settings = new Dictionary<string, object>
{
    ["environment"] = "production",
    ["retries"] = 3
}.ToFrozenDictionary();
Console.WriteLine(settings["retries"]); // 3

Le type FrozenDictionary<TKey, TValue> (à partir de .NET 8+) fournit un dictionnaire figé optimisé pour la lecture. Le type ImmutableDictionary<TKey, TValue> répond aussi au besoin d’immuabilité. Le gel des associations ne rend pas immuables les objets référencés.

sentinel() : construire une valeur sentinelle

sentinel() permet de nommer un objet distinct utilisé pour représenter un état particulier, par exemple l'absence d'un argument lorsque None reste une valeur valide.

MISSING = sentinel("MISSING")

def describe(value=MISSING):
    if value is MISSING:
        return "Argument absent"
    return f"Valeur reçue : {value}"

print(describe())      # Argument absent
print(describe(None))  # Valeur reçue : None

La comparaison évalue l'identité avec l'opérateur is.

Equivalent en C#

object missing = new object();
string Describe(object? value) => ReferenceEquals(value, missing)
    ? "Argument absent"
    : $"Valeur reçue : {value ?? "null"}";
Console.WriteLine(Describe(missing)); // Argument absent
Console.WriteLine(Describe(null));    // Valeur reçue : null

C# n’a pas de constructeur natif de sentinelle nommée équivalent. new object() suffit pour une comparaison d’identité. Dans cet exemple, le marqueur est passé de manière explicite : une nouvelle instance de type object ne peut pas servir directement de valeur de paramètre optionnel C#. Des surcharges prennent en charge la distinction entre l'absence d'argument et la valeur null.