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.