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

5

模块functools指的是在_functools中定义的reduce

同时,_functools指的是在functools中定义的partial

当我试图创建一个命名空间副本以进行猴子补丁时,我遇到了这个问题。但在我的情况下,我需要旧功能和猴子补丁功能,因此需要复制。有什么好的方法可以解决这种循环依赖关系吗?

使用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

似乎reduce都在这两个库里。你可以通过sys.modules["functools"].__dict__["reduce"]functools中找到reduce函数。 - Yaroslav Bulatov
更新了一些源代码。 - Yaroslav Bulatov
那么,如果我正在动态重写模块,应该先重写哪一个?由于reduce在_functools中定义,因此我需要复制_functools中的所有符号,并更新这些符号的__globals__指向新模块。但是由于_functools引用了在functools中定义的partial,所以我应该先重写functools。但这是一个循环依赖。 - Yaroslav Bulatov
我在相关的问题上发起了悬赏:https://dev59.com/aZffa4cB1Zd3GeqP3iWq - Yaroslav Bulatov
不,因为我正在制作副本,所以在构建过程中我将全局变量设置为新值。 - Yaroslav Bulatov
显示剩余2条评论
1个回答

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)

PHP中的真实代码示例:

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

这个也可以避免循环依赖:

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


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接