简体   繁体   中英

Using python decorator functions from a different module

I want to use a function from another module as a decorator, but I need it to manipulate the current module's global namespace.

For example, I want to be able to go from this:

class SomeClass:
    pass

root = SomeClass

to this:

from othermodule import decorator

@decorator
class Someclass:
    pass

Any ideas?

That already works:

from othermodule import decorator

@decorator
class Someclass:
    pass

Just put in othermodule.py :

def decorator(cls):
    #.... do something with cls
    return cls

Having a decorator modify the global namespace if any module, let alone another module, is bad and never necessary. Code that mutates far-away globals is difficult to read and maintain. You should definitely consider modifying your design to avoid mutable global state and especially implicit assignment.

This is a bit hacky, but try this in othermodule.py :

import sys
def decorator(cls):
    mod = __import__(cls.__module__)
    mod.root = cls

Instead of a direct decorator, you can have a function that returns a decorator and accepts the globals of your module:

def decorator(globals):
    def dec(cls):
        globals.root = cls
        return cls
    return dec

@decorator(globals())
class SomeClass:
    ...

The technical post webpages of this site follow the CC BY-SA 4.0 protocol. If you need to reprint, please indicate the site URL or the original address.Any question please contact:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM