Appel de méthode avec __getattr__

Contexte

J'utilise https://pypi.python.org/pypi/twitter comme bibliothèque d'API Twitter, mais notez que l'appel de méthode a changé.

À propos de la bibliothèque Twitter

Cette bibliothèque ne se présente pas sous la forme de passer directement l'URL de l'API, mais dans le style d'appeler la méthode correspondant à l'API. Par exemple, si l'API est users / show, utilisez la méthode twitter.users.show (). À propos, l'URL des utilisateurs / show est https://api.twitter.com/1.1/users/show.json?screen_name=twitterdev Cela ressemble à ceci.

Cependant, cette méthode n'est pas implémentée dans la classe Twitter et la classe TwitterCall de cette bibliothèque, et l'URL est assemblée à partir du nom de la méthode en utilisant pleinement __getattr__ pour appeler l'API.

Exemple de code

Comme exemple de code, cela ressemble à ceci

class A(object):
    def __init__(self, cls, urlparts):
        self.callable_cls = cls
        self.urlparts = urlparts 

    def __getattr__(self, k):
        print('called {}'.format(k))
        try:
            return object.__getattr__(self, k)
        except AttributeError:
            def extend_call(args):
                return self.callable_cls(self.callable_cls, self.urlparts + (args,))
            return  extend_call(k)

    def __call__(self, **kwargs):
        return self.urlparts

a = A(A, ())
res = a.users.show()
print(res)

Cela renverra un tapple ('users', 'show') en conséquence. À partir de maintenant, je vais créer une URL https://api.twitter.com/1.1/users/show.json?screen_name=twitterdev et l'appeler.

Comme explication, lorsque ʻa.users est appelé, il n'y a pas de champ ou de méthode appelé ʻusers, donc __getattr__ est appelé. Dans celui-ci, ʻextend_call (users) est appelé et ajouté en tant que taple à self.urlparts. Ensuite, a.users.show est appelé, car il n'y a pas de méthode appelée show, getattrest appelé. Cela va également dansself.urlpartscomme un taple. Lorsqu'il est finalement appelé en tant que méthode,call est appelé et renvoie le contenu de self.urlparts`.

Résumé

Je ne pense pas que j'utiliserais ce genre d'implémentation, mais en guise de note

Recommended Posts

Appel de méthode avec __getattr__
Méthode de visualisation de données utilisant matplotlib (1)
Méthode de régression linéaire utilisant Numpy
Méthode de visualisation de données utilisant matplotlib (2)
Méthode de connexion SQL utilisant pyodbc
Méthode de visualisation de données utilisant matplotlib (+ pandas) (5)
Méthode de suppression du bruit utilisant la conversion en ondelettes
Méthode de visualisation de données utilisant matplotlib (+ pandas) (4)
Méthode de division de la crête d'eau dans une image 3D à l'aide de ImageJ
Recherche de points de selle à l'aide de la méthode du gradient