Seite 1 von 1

Builtin module in library patchen

Verfasst: Dienstag 16. Dezember 2014, 18:58
von Hazzard
Hi, ich versuche das standard os module zu patchen welches von einer library hergenommen wird.

lib.py:

Code: Alles auswählen

import os

def do():
    return os.getcwd()
patch.py:

Code: Alles auswählen

import os, functools

class MyMonkey(object):
    
    def __init__(self, object):
        self.obj = object
    
    def __getattr__(self, name):
        attr = getattr(self.obj, name)
        @functools.wraps(attr)
        def proxy(*args, **kwargs):
            print("Called {}({}, {})".format(name, args, kwargs))
            return attr(*args, **kwargs)
        return proxy

from lib import do

os = MyMonkey(os)

print(os.getcwd())
print(do())
Der os.getcwd() Aufruf in der patch.py wird ausgegeben, der von do() aus der lib.py nicht. Wie kann ich das fixen?

Vielen Dank für die Hilfe,
Hazzard

Re: Builtin module in library patchen

Verfasst: Dienstag 16. Dezember 2014, 20:18
von Sirius3
@Hazzard: Du hast ja nur das "os" im aktuellen Namensraum geändert, aber nicht im Namensraum von lib.

Re: Builtin module in library patchen

Verfasst: Dienstag 16. Dezember 2014, 22:12
von Hazzard
Kann ich das irgendwie machen, ohne die Lib verändern zu müssen?

Re: Builtin module in library patchen

Verfasst: Mittwoch 17. Dezember 2014, 08:06
von Sirius3
@Hazzard: genauso, wie man Variablen in einem anderen Namensraum abfragt, kann man sie auch setzen.

Re: Builtin module in library patchen

Verfasst: Mittwoch 17. Dezember 2014, 11:00
von Hazzard
argh einfach

Code: Alles auswählen

import lib

lib.os = ...
Danke, irgendwie bin ich da nicht draufgekommen :roll: