在绑定到模块名称空间后终止类

时间:2016-04-21 09:29:23

标签: python python-3.x python-2.x

我正在寻找一种方法来完成类创建,以便在python pre-3.3中重新创建__qualname__。我的元类QualNameMeta以递归方式设置__qualname__并将其传播给成员。由于它的工作方式,我需要在类添加到模块时执行一个函数。

由于函数没有主动参与,我需要测试结果以标记无法访问的资质名称。

class Scope1(object):
    __metaclass__ = QualNameMeta
    def scope_f(self):
        class ScopeF(object):
            __metaclass__ = QualNameMeta
        return ScopeF
    print scope_f.__qualname__ # gives correct Scope1.scope_f
    print scope_f().__qualname__ # gives ScopeF, should be None or Scope1.scope_f.<locals>.ScopeF

此测试可以在创建后轻松完成(不包括展开魔法):

def test_qualname(obj):
    namespace = sys.modules[obj.__module__]
    for name in obj.__qualname__.split('.'):
        try:
            namespace = getattr(namespace, name)
        except AttributeError:  # name does not point to any object
            return False
    return namespace is obj  # make sure we got the right one

但是,我不能直接从元类中使用它。如果我在test_qualnameQualMeta.__new__中呼叫QualMeta.__init__,则该对象的尚未绑定到模块。所以,在对象绑定到模块之后,我需要一种方法来执行检查

为什么不装饰者? 我需要它继续使用继承,因此只能通过修改基类来修补整个类层次结构。使用元类是我到目前为止找到的唯一解决方案。

一个最小的虚拟例子:

class QualMeta(type):
    def __new__(mcs, name, bases, class_dict):
        new_cls = type.__new__(mcs, name, bases, class_dict)
        new_cls.__qualname__ = name  # dummy for top-level only
        if not test_qualname(new_cls):  # new_cls is not bound yet, test will fail
            new_cls.__qualname__ = None
        return new_cls


class Qualnamed(object):
    __metaclass__ = QualMeta

print(Qualnamed.__qualname__)  # gives None

1 个答案:

答案 0 :(得分:0)

您需要在for f in *.txt; do head -n 100 $f > small/$f done 中设置新属性,并让class_dict进行绑定:

type.__new__()