message: Fix compat_util to properly import the fallback module, and include a helper that can emulate `nonlocal`.
diff: @@ -18,17 +18,28 @@ from __future__ import absolute_import
  from __future__ import division
  from __future__ import print_function
  +import importlib
  import sys
  +import types
  import six
  +class BasicRef(object):
  + """This shim emulates the nonlocal keyword in Py2-compatible source."""
  +
  + def __init__(self, init_value):
  + self.value = init_value
  +
  +
  def deprecated_py2_support(module_name):
  + """Swaps calling module with a Py2-specific implementation. Noop in Py3."""
  if six.PY2:
  - legacy_module = __import__(module_name + '_deprecated_py2')
  + legacy_module = importlib.import_module(module_name + '_deprecated_py2')
  current_module = sys.modules[module_name]
  - current_module.__dict__.update({
  - k: v
  - for k, v in legacy_module.__dict__.items()
  - if not k.startswith('__')
  - })
  + for name, target_val in legacy_module.__dict__.items():
  + if isinstance(target_val, types.FunctionType):
  + replacement = types.FunctionType(
  + target_val.__code__, current_module.__dict__, target_val.__name__,
  + target_val.__defaults__, target_val.__closure__)
  + current_module.__dict__[name] = replacement
  