dic在这里的用法是什么

时间:2019-11-21 09:48:56

标签: python python-2.x

我正在阅读Python source codes,并且在Python-2.7.10 / Lib / multiprocessing / managers.py中找到了这段代码。

我只是想知道% (meth, meth) in dic在这里的用途是什么,因为我认为%首先会关联字符串,而exec总是返回None

def MakeProxyType(name, exposed, _cache={}):
    '''
    Return an proxy type whose methods are given by `exposed`
    '''
    exposed = tuple(exposed)
    try:
        return _cache[(name, exposed)]
    except KeyError:
        pass

    dic = {}

    for meth in exposed:
        exec '''def %s(self, *args, **kwds):
        return self._callmethod(%r, args, kwds)''' % (meth, meth) in dic

    ProxyType = type(name, (BaseProxy,), dic)
    ProxyType._exposed_ = exposed
    _cache[(name, exposed)] = ProxyType
    return ProxyType

1 个答案:

答案 0 :(得分:3)

您可以将其改写为

code = '''def %s(self, *args, **kwds):
        return self._callmethod(%r, args, kwds)''' % (meth, meth)
exec code in dic

依次使用exec ... in ...形式:

  

在所有情况下,如果省略了可选部分[in ...],则代码将在当前作用域中执行。如果仅指定in之后的第一个表达式,则应为字典,该字典将用于全局变量和局部变量。如果给出两个表达式,它们分别用于全局变量和局部变量。如果提供的话,本地变量可以是任何映射对象。请记住,在模块级别,全局变量和本地变量是同一字典。如果给定两个单独的对象作为全局对象和局部对象,则代码将像嵌入在类定义中一样执行。

也就是说,代码将在要创建的代理类型的类变量字典中执行。