2016-05-21 9 views
5

Moduł functools odnosi się do reduce, który jest zdefiniowany w _functools. Tymczasem _functools dotyczy partial który jest zdefiniowany w functoolsRadzenie sobie z zależnością cykliczną (funktools -> _functools -> functools) podczas kopiowania przestrzeni nazw

używam do tego problemu podczas próby utworzenia kopii przestrzeni nazw dla celów małpa-łatanie. Ale w moim przypadku potrzebuję zarówno starej, jak i małpiej funkcjonalności, dlatego potrzebuję kopii. Wszelkie sugestie, jaki jest dobry sposób na okrężne zależności, takie jak ten?

Korzystanie Python 2.7.10

jakiś kod źródłowy na życzenie

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

Wydaje 'zmniejszyć 'jest w obu. Możesz zobaczyć 'reduce' w' functools' z 'sys.modules [" functools "] .__ dict __ [" reduce "]' –

+0

zaktualizowany o jakiś kod źródłowy –

+0

Więc jeśli jestem dynamicznie przepisywanie modułów, które należy powinienem przepisać pierwszy? Ponieważ redu jest zdefiniowany w '_functools', muszę skopiować wszystkie symbole w' _functools' i zaktualizować wszystkie '__globals__' tych symboli, aby wskazywały na nowy moduł. Ale ponieważ '_functools' ma odniesienie do' częściowego 'zdefiniowanego w' functools', powinienem najpierw przepisać 'functools'. Ale to jest zależność cykliczna. –

Odpowiedz

0

można po prostu zapamiętać, co widzieliście (identity comparison) do tej pory i nie iteracyjnego lub zejść do rzeczy, które można zapamiętać.

Być może nie rozumiem złożoności operacji (kopiowanie przestrzeni nazw).

tylko sugestia:

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) 

rzeczywistym przykładowy kod w PHP:

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

Ten unika okrągłe deps także:

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

Powiązane problemy