2 votes

Exécution automatique du code devant les méthodes du module

J'utilise le demande mais la question est beaucoup plus générique.

Existe-t-il un moyen d'exécuter automatiquement le code avant d'appeler les méthodes des modules importés ?

Cela rendrait l'écriture du code plus facile pour moi. Pour le moment, j'ai peur de marteler des webservices conviviaux, donc à moins de trouver une réponse, je vais devoir mettre en place mes propres contrôles.


Je pensais qu'en faisant ça :

import requests as requests2

...puis à un moment donné, plus loin dans le code, définir un requests() avec des arguments spéciaux ou une syntaxe magique non découverte. Après avoir exécuté son propre code, la sauce spéciale transmettait les appels de méthode au module réel aliasé à requests2 .

Cela peut-il être fait ?

3voto

katrielalex Points 40655

Vous avez la bonne idée. Créez un proxy pour les "requêtes" qui fait ce qu'il veut faire puis transmet l'appel de la méthode à l'utilisateur réel. requests module. Par exemple

class RequestProxy(object):
    def __init__(self):
        import requests as _requests
        self._requests = _requests

    def __getattribute__(self, attr):
        run_custom_code()
        return getattr(self._requests, attr)

requests = RequestProxy()

3voto

Claudiu Points 58398

Vous voulez dire quelque chose comme ajouter des décorateurs à chaque fonction d'un autre module ? Vous pourriez émuler cela avec une classe :

class RequestsProxy(object):
    def __init__(self):
        self.special_sauce_decorator = special_sauce_indeed()
        self._requests = __import__("requests")

    def __getattr__(self, attrname):
        val = getattr(self._requests, attrname) 
        if callable(val):
            return self.special_sauce_decorator(val)
        return val

Exemple d'utilisation :

>>> def special_sauce_indeed():
        def decorator(f):
                def wrapped(*args, **kwargs):
                        print 'wrapped'
                        return f(*args, **kwargs)
                return wrapped
        return decorator

>>> class OsProxy(object):
        def __init__(self):
            self.special_sauce_decorator = special_sauce_indeed()
            self._requests = __import__("os")

        def __getattr__(self, attrname):
            val = getattr(self._requests, attrname)
            if callable(val):
                return self.special_sauce_decorator(val)
            return val

>>> os = OsProxy()
>>> os.listdir(".")
wrapped
['DLLs', 'Doc', 'faiojerf.py', 'func_counter_test.py', 'include', 'inet_time.py', 'kcol.py', 'Lib', 'libs', 'LICENSE.txt', 'memoize_test.py', 'minpy.py', 'NEWS.txt', 'numpy-wininst.log', 'paren_test.py', 'PIL-wininst.log', 'psycopg2-wininst.log', 'python.exe', 'pythonw.exe', 'pywin32-wininst.log', 'README.txt', 'Removenumpy.exe', 'RemovePIL.exe', 'Removepsycopg2.exe', 'Removepywin32.exe', 'Removescipy.exe', 'Removesetuptools.exe', 'scipy-wininst.log', 'Scripts', 'setuptools-wininst.log', 'slots.py', 'so1.py', 'staticvar.py', 'summing.py', 'taojiwjiot.,py', 'tcl', 'templol.py', 'test.py', 'thunkify_test.py', 'TicketNumberGenerator.py', 'Tools', 'w9xpopen.exe', 'wordcount.py']

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X