2

私はrequestsモジュールを使用していますが、質問ははるかに一般的です。

インポートされたモジュールからメソッドを呼び出す前にコードを自動的に実行する方法はありますか?

これにより、コードの記述が容易になります。現時点では、フレンドリーなWebサービスを利用することを心配しているため、答えが見つからない限り、独自のコントロールを実装する必要があります。


私はこれを行うことによって考えました:

import requests as requests2

...次に、コードのさらに先のある時点で、requests()特別な引数または魔法の未発見の構文を使用して関数を定義します。独自のコードを実行した後、特別なソースは、にエイリアスされた実際のモジュールにメソッド呼び出しを転送しrequests2ます。

これはできますか?

4

2 に答える 2

3

あなたは正しい考えを持っています。'requests'のプロキシを作成し、実行したいことをすべて実行してから、メソッド呼び出しを実際のrequestsモジュールに転送します。例えば

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()
于 2012-08-13T22:47:18.900 に答える
3

別のモジュールのすべての関数にデコレータを追加するようなものですか?あなたはクラスでそれをエミュレートすることができます:

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

使用例:

>>> 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']
于 2012-08-13T22:50:12.890 に答える