2010-09-30 16 views
19

निम्नलिखित कोड नाम दिया (एक दुभाषिया में सीधे नहीं है, लेकिन फाइल के रूप में निष्पादित)मिश्रण वैश्विक/मापदंडों और समारोह 'शीर्ष'

def top(deck): 
    pass 

def b(): 
    global deck 

साथ अजीब अजगर व्यवहार पर त्रुटि

SyntaxError: name 'deck' is local and global 

का उत्पादन python2.6.4 और

SyntaxError: name 'deck' is parameter and global 

अजगर पर 3.1

python2.4 इस कोड को स्वीकार करने के लिए प्रतीत होता है, तो 2.6.4 इंटरैक्टिव दुभाषिया है।

यह पहले से ही विषम है; 'डेक' विरोधाभासी क्यों है यदि यह एक विधि में वैश्विक है और दूसरे में पैरामीटर है?

लेकिन यह वीडर हो जाता है। मूल रूप से किसी अन्य चीज़ के लिए 'शीर्ष' का नाम बदलें, और समस्या गायब हो जाती है।

क्या कोई इस व्यवहार को समझा सकता है? मुझे लगता है कि मैं यहाँ कुछ बहुत याद कर रहा हूँ। क्या नाम 'शीर्ष' किसी भी तरह से कुछ स्कोपिंग आंतरिक को प्रभावित करता है?

अद्यतन

यह वास्तव में अजगर कोर में एक बग प्रतीत होता है। I have filed a bug report

+2

एफडब्ल्यूआईडब्ल्यू, मैं 2.6.5 और 3.1.2 में इस व्यवहार की पुष्टि कर सकता हूं। – aaronasterling

+1

हाँ, 2.5.2 – shylent

+0

में 'प्रिंट टॉप' उपज जोड़ना 'नाम' शीर्ष 'परिभाषित नहीं किया गया है ", इसलिए कम से कम यह कोई फ़ंक्शन या कुछ नहीं है। अजीब। –

उत्तर

13

ऐसा लगता है कि यह प्रतीक तालिका हैंडलिंग में एक बग है।

if (name == GET_IDENTIFIER(top)) 
    st->st_global = st->st_cur->ste_symbols; 

वहाँ इसके अलावा फाइल एक:

if (!GET_IDENTIFIER(top) || 
    !symtable_enter_block(st, top, ModuleBlock, (void *)mod, 0)) { 
    PySymtable_Free(st); 
    return NULL; 
} 

कुछ हद तक द्वारा बाद में पीछा किया: अजगर/symtable.c कुछ कोड है कि (कुछ सुलझा हालांकि) वास्तव में एक विशेष पहचानकर्ता के रूप में 'शीर्ष' का इलाज करता है मैक्रो:

#define GET_IDENTIFIER(VAR) \ 
    ((VAR) ? (VAR) : ((VAR) = PyString_InternFromString(# VAR))) 

जो चर के नाम के साथ एक प्रशिक्षु स्ट्रिंग के लिए चर top आरंभ करने के लिए सी पूर्वप्रक्रमक उपयोग करता है।

मुझे लगता है कि प्रतीक तालिका शीर्ष स्तर कोड को संदर्भित करने के लिए 'शीर्ष' नाम का उपयोग करनी चाहिए, लेकिन ऐसा क्यों नहीं है जो वास्तविक चर के साथ संघर्ष नहीं कर सकता है, मुझे कोई जानकारी नहीं है।

यदि मैं आप थे तो मैं इसे एक बग के रूप में रिपोर्ट करूंगा।

+0

-1 आपका अनुसरण नहीं कर सकता है। रनटाइम असेंबलर कोड यह नहीं देख सकता कि चर को स्रोत में "शीर्ष" कहा जाता था। यदि स्ट्रिंग '" शीर्ष "कहीं भी हो तो यह अलग होगा। –

+1

मैक्रो प्रभावी रूप से नीचे उबलता है: '((शीर्ष)? (शीर्ष): ((शीर्ष) = PyString_InternFromString (" शीर्ष ")) '(सी प्री-प्रोसेसर सिंटैक्स # VAR का अर्थ है मैक्रो पैरामीटर का मान बदलना एक स्ट्रिंग) – Duncan

+0

+1 मैं देखता हूं। मैंने अपना वोट बदल दिया। –

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