[Road to Intermediate] Utiliser les variables de fonction intégrées de Python

Lien vers le résumé

https://qiita.com/ganariya/items/fb3f38c2f4a35d1ee2e8

introduction

Afin d'étudier Python, j'ai copié une bibliothèque d'intelligence de groupe appelée acopy.

Dans acopy, de nombreuses grammaires et idiomes Python intéressants sont utilisés, et il est résumé que c'est utile parmi eux.

Cette fois, nous examinerons une fonction intégrée appelée vars.

Qu'est-ce que Vars?

Il existe plusieurs fonctions intégrées en python, dont l'une s'appelle vars. vars (x) renvoie l'attribut __dic__ de l'objet $ x $ sous forme de dictionnaire.

Qu'est-ce que «dic»?

__dic__ est l'attribut dict d'un objet d'un module ou d'une instance de classe. L'attribut dict contient les valeurs associées aux noms de toutes les propriétés définies sur l'objet.

Exemple concret

Voyons dans un code simple que vars renvoie l'attribut __dic__.

class A:

    def __init__(self, x, y):
        self.x = x
        self.y = y


def f():
    x = 50
    print(vars())


a = A(10, 20)
'''
{'x': 10, 'y': 20}
'''
print(vars(a))

'''
{'x': 50}
'''
f()

Essayez d'utiliser vars sur l'objet a de la classe A. Ensuite, vous pouvez obtenir l'attribut __dic__ défini dans l'objet a de la classe A, c'est-à-dire toutes les informations d'instance de a dans le dictionnaire. De plus, comme la table de symboles locale de la fonction est définie dans la fonction, si rien n'est spécifié dans vars, __dic__ de la table de symboles locale est renvoyée. Par conséquent, il renvoie un dictionnaire de x.

De cette façon, vars vous permet d'apprendre l'attribut __dic__.

Utilisation: passer tous les objets

En utilisant vars, par exemple, toutes les informations sur une instance d'une classe peuvent être transmises à d'autres méthodes de classe. En effet, il peut être combiné avec une fonction appelée ** Unpack **.

Par exemple, jetez un œil au code ci-dessous.

class KeywordPrinter:

    @staticmethod
    def printer(**kwargs):
        text_arr = [f'(key = {key}, value = {kwargs[key]})' for key in kwargs.keys()]
        return ', '.join(text_arr)


class A:

    def __init__(self, x, y):
        self.x = x
        self.y = y

    def __repr__(self):
        return self.__class__.__name__ + KeywordPrinter.printer(**vars(self))


'''
A(key = x, value = 10), (key = y, value = 20)
'''
a = A(10, 20)
print(a)

Tout d'abord, définissez une classe appelée KeywordPrinter qui convertit tous les dictionnaires en chaînes.

De plus, nous définirons une méthode avec l'attribut __repr__ dans la classe A afin que print puisse afficher une chaîne de caractères arbitraire, visant un état de débogage plus simple.

Maintenant, dans __repr__, j'ai passé quelque chose appelé ** vars (self) à KeywordPrinter. Tout d'abord, obtenez les informations du dictionnaire de propriétés de l'instance a avec vars (self). Ensuite, en le décompressant et en le passant à l'imprimante, le dictionnaire sera renvoyé sous forme de chaîne de caractères d'une manière facile à lire.

Ceci est un exemple extrême et ne doit pas être utilisé très souvent, mais dans le codage réel, il existe des situations où «je veux passer rapidement une variable locale» à d'autres méthodes, classes et fonctions. À ce stade, vous pourrez peut-être réduire la quantité de codage en utilisant «** vars (self)».

J'étudierai plus.

Les références

Recommended Posts

[Road to Intermediate] Utiliser les variables de fonction intégrées de Python
[Road to Intermediate] Que sont les * args, ** kwargs de Python?
[Route vers Python intermédiaire] Définir la fonction __getattr__ dans la classe
Une route vers Python intermédiaire
[Road to Intermediate Python] Appelez une instance de classe comme une fonction avec __call__
Road to Intermediate Linux: Network Edition
[Road to Intermediate] Comprendre les propriétés Python
[Route vers Python intermédiaire] Utiliser des opérateurs ternaires
[Route vers Python intermédiaire] Résumé du lien de l'article