2016-05-21 6 views
5

मॉड्यूल functoolsreduce को संदर्भित करता है जिसे _functools में परिभाषित किया गया है, तो परिपत्र निर्भरता (functools -> _functools -> functools) के साथ काम करना। इस बीच _functoolspartial जिसमें functoolsनामस्थान

मैं इस समस्या में चल रहा हूँ जब बंदर-पैच उद्देश्यों के लिए नाम स्थान की प्रतिलिपि तैयार करने की कोशिश कर रहा परिभाषित किया गया है को दर्शाता है। लेकिन मेरे मामले में, मुझे पुरानी और बंदर-पैच की कार्यक्षमता दोनों की आवश्यकता है, इसलिए एक प्रतिलिपि की आवश्यकता है। कोई सुझाव इस तरह परिपत्र निर्भरताओं के लिए एक अच्छा तरीका क्या है?

अनुरोध

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 "] के साथ' functools' में 'low'' देख सकते हैं .__ dict __ ["low"] ' –

+0

कुछ स्रोत कोड –

+0

के साथ अपडेट किया गया है, इसलिए यदि मैं गतिशील रूप से मॉड्यूल को फिर से लिख रहा हूं, तो मुझे किसको लिखना चाहिए प्रथम? चूंकि '_functools' में कम परिभाषित किया गया है, इसलिए मुझे' _functools' में सभी प्रतीकों की प्रतिलिपि बनाने और नए मॉड्यूल को इंगित करने के लिए उन प्रतीकों के सभी '__globals__' को अपडेट करने की आवश्यकता है। लेकिन चूंकि '_unctools' में 'functools' में परिभाषित' आंशिक 'का संदर्भ है, इसलिए मुझे पहले' functools' को फिर से लिखना चाहिए। लेकिन यह एक परिपत्र निर्भरता है –

उत्तर

0

आप बस याद कर सकते हैं कि तुम क्या देखा है (identity comparison) प्रति Python 2.7.10

कुछ स्रोत कोड का उपयोग करते हुए अब तक और नहीं से अधिक पुनरावृति या सामान तुम्हें याद में उतर।

शायद मैं ऑपरेशन की जटिलता (कॉपी नेमस्पेस) को समझ नहीं रहा हूं।

बस एक सुझाव:

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

संबंधित मुद्दे