如何在其他模块上下文中执行代码

时间:2013-12-10 09:39:01

标签: python class binding module metaclass

使用此代码我想获得“主要文件”和“ abc ”,但我得到ModelBase,Model等。 。 我不知道我能做什么。我在b.py中定义了abc,所以我认为它应该在b.py。

的全局范围内执行

模块model.py:

class ModelBase(type):
    def __new__(cls,name,bases,attrs):
         module = attrs.pop('__module__');
         super_new = super(ModelBase,cls).__new__
         def test(cls):
             # want to print and references globals from Module b
             gl = globals()
             for i in gl:
                  print i
        new_class = super_new(cls,name,bases,{'__module__':module,'test':test})
        return new_class
class Model(object):
    __metaclass__ = ModelBase

模块b.py:

from model import *
class abc(Model):
    pass
tt = t();
tt.test();

1 个答案:

答案 0 :(得分:1)

您可以通过检查调用堆栈来查找调用者的全局变量。但是,请注意评论in the docs of sys._getframe

  

CPython实现细节:此函数应该用于   仅限内部和专门用途。它不能保证存在   在Python的所有实现中。

无论如何,获得直接调用者的全局变量所需的代码是

sys._getframe(1).f_globals