Builtin module in library patchen

Wenn du dir nicht sicher bist, in welchem der anderen Foren du die Frage stellen sollst, dann bist du hier im Forum für allgemeine Fragen sicher richtig.
Antworten
Hazzard
User
Beiträge: 26
Registriert: Dienstag 4. Dezember 2007, 21:09

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
Sirius3
User
Beiträge: 17750
Registriert: Sonntag 21. Oktober 2012, 17:20

@Hazzard: Du hast ja nur das "os" im aktuellen Namensraum geändert, aber nicht im Namensraum von lib.
Hazzard
User
Beiträge: 26
Registriert: Dienstag 4. Dezember 2007, 21:09

Kann ich das irgendwie machen, ohne die Lib verändern zu müssen?
Sirius3
User
Beiträge: 17750
Registriert: Sonntag 21. Oktober 2012, 17:20

@Hazzard: genauso, wie man Variablen in einem anderen Namensraum abfragt, kann man sie auch setzen.
Hazzard
User
Beiträge: 26
Registriert: Dienstag 4. Dezember 2007, 21:09

argh einfach

Code: Alles auswählen

import lib

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