Existe-t-il une manière pythonique de se référer à l'objet courant (auto-référence) que nous déclarons avec (certains) types intégrés de Pythons?

Oct 14 2020

Avec (certains) types intégrés Pythons, est-il possible de faire référence à l'objet que nous déclarons? Par «(certains) types intégrés», je pense, par exemple, aux types de séquence, aux types de mappage ou aux types d'ensemble, évidemment pas aux types numériques.

Je veux dire, sans créer moi-même une classe et ajouter cette fonctionnalité (sans créer une sous-classe).

Donc, quelque chose comme le thismot - clé utilisé dans les exemples ci-dessous.

Par exemple, pour le type intégré Python "dict", quelque chose comme ceci:

a_dictionary = {
    "key_1": "value_1",
    "key_2": "value_2",
    "key_3": this["key_1"] + "_" + this["key_2"] # == "value_1_value_2"
}

ou même:

a_dictionary = {
    "sub_dict_1": {
        "key_1": "value_1_1",
        "key_2": "value_1_2",
        "key_3": this["key_1"] + "_" + this["key_2"] # == "value_1_1_value_1_2"
    },
    "sub_dict_2": {
        "key_1": "value_2_1",
        "key_2": "value_2_2",
        "key_3": this["key_1"] + "_" + this["key_2"] # == "value_2_1_value_2_2"
    }
}

J'ai lu :

Lors du chaînage de fonctions en python, existe-t-il un moyen de faire référence à l'objet "courant"?

Que dois-je faire lorsque j'ai besoin d'un dictionnaire auto-référentiel?

Référencez un dictionnaire en lui-même

Classes d'auto-référencement en python?

Existe-t-il un moyen de faire référence à la fonction actuelle en python?

Est-il possible d'accéder à l'objet courant tout en faisant la compréhension de liste / dictée en Python?

et quelques autres, mais cela ne correspond pas aux exigences décrites au début de ma question.

Merci beaucoup pour votre aide!

Réponses

8 chepner Oct 14 2020 at 22:00

Python ne fournit aucun moyen de faire référence à un objet en construction par un littéral ou un affichage *. Vous pouvez (ab) utiliser l'expression d'affectation dans Python 3.8 ou version ultérieure pour simuler ceci:

a_dictionary = {
    "key_1": (x := "value_1"),
    "key_2": (y := "value_2"),
    "key_3": x + "_" + y 
}

Cela nécessite une certaine planification à l'avance, car vous ne faites pas référence directement à une valeur clé, mais plutôt à une variable prédéfinie. Notez que xet yrestez dans la portée après l'affectation à a_dictionary, donc c'est juste un équivalent discutable de

x = "value_1"
y = "value_2"
a_dictionary = {
    "key_1": x,
    "key_2": y,
    "key_3": x + "_" + y
}

Une classe personnalisée serait vraiment plus appropriée:

class Thing:
    def __init__(self, v1, v2):
        self.key_1 = v1
        self.key_2 = v2
        self.key_3 = v1 + "_" + v2


a_thing = Thing("value_1", "value_2")

  • Un affichage est une construction semblable à un littéral, mais peut contenir des références non littérales. Par exemple, les affichages de liste incluent [1, x, y]et [int(x) for x in foo].
Rivers Oct 15 2020 at 00:52

Après quelques recherches, et uniquement pour le cas d'un dictionnaire, j'ai trouvé cette autre solution de contournement, basée sur Que dois-je faire lorsque j'ai besoin d'un dictionnaire auto-référentiel? :

class MyDict(dict):
    def __getitem__(self, item):
        return dict.__getitem__(self, item).format(self)

a_dictionary = MyDict({
    "key_1": "value_1",
    "key_2": "value_2",
    "key_3": "{0[key_1]}" + "_" + "{0[key_2]}" # == "value_1_value_2"
})