TAGS :Viewed: 5 - Published at: a few seconds ago

[ 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?

Answer 1


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

Answer 2


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.

Answer 3


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

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