2012-06-13 15 views
8

क्या पाइथन मानक लाइब्रेरी में एक "निजी" विशेषता नाम के साथ पाइथन के नाम मैंगलिंग योजना को पुन: उत्पन्न करने के लिए कोई फ़ंक्शन है? ऐसा लगता है जैसे होगा, लेकिन मुझे यह मेरे जीवन के लिए नहीं मिल रहा है।पायथन नाम मैंगलिंग फ़ंक्शन

मैंने यह लिखा, लेकिन यदि कोई बेहतर तरीका है तो मैं सभी कान हूं।

def mangle_name (cls, attrname) : 
    prefix = '_' + cls.__name__.lstrip('_') 

    if not attrname.startswith('__') : 
     attrname = '__' + attrname 

    if not attrname.endswith('__') : 
     return prefix + attrname 
    else : 
     return attrname 

class Foo : 
    __some_such = 3 

name = mangle_name(Foo, '__some_such') 
print name 
print hasattr(Foo(), name) 
+3

मैं बहुत यकीन है कि वहाँ में ऐसी कोई समारोह है कर रहा हूँ मानक पुस्तकालय आपको ये किस लिए चाहिए? –

+8

मैं कल्पना कर सकता हूं कि यह लगभग हमेशा कुछ बुरा करने के लिए उपयोग किया जा रहा है। –

+0

असल में, मुझे गतिशील रूप से मनमाने ढंग से कक्षा के निजी विशेषताओं तक पहुंचने की आवश्यकता है। कार्य ऊपर काम करता है; हालांकि, इसमें समस्याएं हो सकती हैं कि मुझे अनजान है (कुछ अप्रत्याशित मुद्दा)। तो किसी और का उपयोग करना सबसे अच्छा विकल्प लगता है। – rectangletangle

उत्तर

14

ऐसा लगता है कि compiler मॉड्यूल इस के लिए एक अजगर कार्यान्वयन है की तरह, हस्ताक्षर mangle(name, klass) वह जगह है जहाँ klass वर्ग के नाम, नहीं वस्तु ही है।

>>> from compiler.misc import mangle 
>>> mangle('__some_such', 'Foo') 
'_Foo__some_such' 

ध्यान दें कि संकलक मॉड्यूल अजगर 2.6 के बाद से हटा दिया गया है और अजगर 3.0 में मौजूद नहीं है:

यहाँ आप कैसे जाएं और इसका इस्तेमाल कर सकते हैं।

यहाँ समारोह में ही (Python 2.7 source code से) मामले में आप सिर्फ अपने स्रोत में कॉपी या सत्यापित अपने संस्करण बराबर है कि चाहते हैं:

MANGLE_LEN = 256 # magic constant from compile.c 

def mangle(name, klass): 
    if not name.startswith('__'): 
     return name 
    if len(name) + 2 >= MANGLE_LEN: 
     return name 
    if name.endswith('__'): 
     return name 
    try: 
     i = 0 
     while klass[i] == '_': 
      i = i + 1 
    except IndexError: 
     return name 
    klass = klass[i:] 

    tlen = len(klass) + len(name) 
    if tlen > MANGLE_LEN: 
     klass = klass[:MANGLE_LEN-tlen] 

    return "_%s%s" % (klass, name) 
+0

यह काम करता है, धन्यवाद! – rectangletangle

+1

क्या Python 3 में कोई stdlib प्रतिस्थापन नहीं है? ऐसा लगता है कि अगर कोई 256 से अलग मूल्य का उपयोग करता है तो यह हमारे लिए लाइब्रेरी फ़ंक्शन बेहतर होगा। उदाहरण के लिए, पीपीपी, ज्योथन और आयरनपीथन का क्या उपयोग होता है? – asmeurer

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