какой толк от `in dic` здесь - PullRequest
       46

какой толк от `in dic` здесь

0 голосов
/ 21 ноября 2019

Я читаю Исходные коды Python , и я нахожу этот код в Python-2.7.10 / Lib / multiprocessing / Manager.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 Ответ

3 голосов
/ 21 ноября 2019

Вы можете перефразировать его как

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

, который, в свою очередь, использует форму exec ... in ...:

Во всех случаях, если дополнительные детали[in ...] опущены, код выполняется в текущей области видимости. Если указано только первое выражение после in, это должен быть словарь, который будет использоваться как для глобальных, так и для локальных переменных. Если даны два выражения, они используются для глобальных и локальных переменных соответственно. Если предоставлено, локальные могут быть любым отображающим объектом. Помните, что на уровне модуля глобальные и локальные значения - это один и тот же словарь. Если два отдельных объекта задаются как глобальные и локальные, код будет выполняться так, как если бы он был встроен в определение класса.

То есть код будет выполняться внутри создаваемого объекта. словарь переменных класса прокси-типа.

...