2016-05-21 48 views
5

模塊functools是指在_functools中定義的reduce。 同時_functoolspartial這是在functools複製命名空間時處理循環依賴(functools - > _functools - > 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 
+0

似乎'減少'在兩個。你可以用'sys.modules [「functools」] .__ dict __ [「reduce」]看到'functools'中的'reduce'' –

+0

更新了一些源代碼 –

+0

所以如果我動態地重寫模塊,應該重寫哪一個模塊第一?由於在'_functools'中定義了reduce,因此我需要複製'_functools'中的所有符號,並更新這些符號的所有'__globals__'以指向新模塊。但由於'_functools'引用了'functools'中定義的'partial',我應該首先重寫'functools'。但這是一個循環依賴 –

回答

0

你可以簡單地記住你所看到的(identity comparison)一些源代碼,到目前爲止,並沒有遍歷或下降到你記住的東西。

也許我不理解操作的複雜性(複製命名空間)。

只是一個建議:在PHP

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) 

真實的代碼示例:

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

這一個避免圓形DEPS還有:

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