【问题标题】:what's the usage of `in dic` here这里的`in dic`有什么用
【发布时间】:2019-11-21 09:48:56
【问题描述】:

我正在阅读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

【问题讨论】:

    标签: python python-2.x


    【解决方案1】:

    你可以改写成

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

    它又使用exec ... in ... 形式:

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

    即代码将在待创建代理类型的类变量字典中执行。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2016-06-04
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多