复制命名空间时处理循环依赖(functools - > _functools - > functools)

Yar*_*tov 5 python

模块functools 指的reduce是定义中的_functools.同时_functools指的是partial哪个被定义functools

我在尝试为猴子修补目的创建命名空间副本时遇到了这个问题.但在我的情况下,我需要旧的和猴子修补的功能,因此需要一个副本.有什么建议这样的循环依赖是一个好方法吗?

运用 Python 2.7.10

每个请求一些源代码

def _get_dependent_modules(m):
  """Return set of all modules defining symbols in given module."""

  modules = set()
  for symbol_name, symbol in m.__dict__.items():
    if hasattr(symbol, '__module__'):
        if symbol.__module__ in sys.modules:
          print "Symbol %s, defined in %s" % (symbol_name, symbol.__module__)
          modules.add(sys.modules[symbol.__module__])
        else:
          print "Cant find module for %s" %(symbol)
  return modules

_get_dependent_modules(functools)

Symbol wraps, defined in functools
Symbol partial, defined in functools
Symbol update_wrapper, defined in functools
Symbol total_ordering, defined in functools
Symbol reduce, defined in _functools
Symbol cmp_to_key, defined in functools

_get_dependent_modules(sys.modules["_functools"])

Symbol partial, defined in functools
Symbol reduce, defined in _functools
Run Code Online (Sandbox Code Playgroud)

Яро*_*лин 0

您可以简单地记住到目前为止所看到的内容(身份比较),而不必迭代或深入到您记住的内容中。

也许我不理解操作的复杂性(复制命名空间)。

只是一个建议:

sub scan_symbols(object):
    for each member in object:
        if member is of type-primitive:
            whatever
        if member is of type-object:
            record member reference if not already recorded
            if reference is new:
                scan_symbols(member)
Run Code Online (Sandbox Code Playgroud)

PHP 中的真实代码示例:

https://raw.githubusercontent.com/pradosoft/prado/master/framework/Util/TVarDumper.php

这也避免了循环依赖:

https://github.com/symfony/var-dumper