2009-12-15 11 views
10

क्या आपके शरीर में वास्तव में अपने शरीर की घोषणा करने से पहले अपनी फ़ाइल में फ़ंक्शंस का उपयोग करने के लिए कोई तरीका है?क्या उनके शरीर को अजगर में घोषित करने से पहले कार्यों का उपयोग करना संभव है?

निम्नलिखित कोड काम करने के लिए प्रतीत नहीं होता:

abc = myFunction 

def myFunction(): 
    print "123" 

धन्यवाद

उत्तर

17

आप इसे सौंपा जाने से पहले myFunction चर का उपयोग नहीं कर सकते। आपका उदाहरण कोड समान है:

def myFunction(): 
    print abc 
    abc = 123 

आप क्या चाहते करने के लिए, या तो आदेश फिर से व्यवस्था:

def myFunction(): 
    print "123" 

abc = myFunction 

या abc के रूप में घोषित सिर्फ एक प्रॉक्सी:

# Style 1 
abc = lambda: myFunction() 

# Style 2 
def abc(): 
    return myFunction() 

def myFunction(): 
    print "123" 

हैं आपका फ़ंक्शन पैरामीटर लेता है, *args और **kwargs का उपयोग करें:

# Style 1 
abc = lambda *args, **kwargs: myFunction(*args, **kwargs) 

# Style 2 
def abc(*args, **kwargs): 
    return myFunction(*args, **kwargs) 

def myFunction(x): 
    print x 
+0

हाय। मैं सोच रहा था कि तर्कों को स्वीकार करने वाले कार्यों के लिए शैली # 1 का उपयोग करने का कोई तरीका था या नहीं। धन्यवाद – Pradyot

+0

प्रद्योट: * args और * kwargs का उपयोग करें। abc = lambda * args, ** kwargs: myFunction (* args, ** kwargs) –

1

कम जवाब नहीं है।

पायथन में, बयान का मूल्यांकन किया जाता है क्योंकि उन्हें पार्स किया गया है - myFunction को पार्स नहीं किया गया था इसलिए पाइथन को इसके बारे में पता नहीं है।

+3

क्या कोई लंबा उत्तर है? –

+1

लंबा जवाब क्या है? –

+1

... अगर केवल एसओ पर "ड्राफ्ट ड्राफ्ट" विकल्प था ... – jldupont

13

आप कार्यों कि आगे का उपयोग घोषणाओं घोषणा कर सकते हैं, लेकिन अजगर ऊपर से नीचे तक अपने स्रोत में कार्यान्वित कोड। तो, यह संकलन और चलाने होगा:

def foo(): 
    print "in foo" 
    bar() 

def bar(): 
    print "in bar" 
    foo() 

foo() 

(छोड़कर यह रनटाइम पर एक ढेर अतिप्रवाह कारण होगा निश्चित रूप से,)। अपने उदाहरण में, अजगर क्रियान्वित लाइन

abc = myFunction 

myFunction से पहले कुछ भी रूप में परिभाषित किया जाता है। आप इसके स्रोत कोड को इंटरैक्टिव रूप से दुभाषिया में टाइप करने के मामले में इसके बारे में सोच सकते हैं। जब आप अपना असाइनमेंट टाइप करते हैं, तो आपके पास में myFunction की परिभाषा अभी तक नहीं होगी, इसलिए पाइथन इसका उल्लेख करने में सक्षम नहीं होगा।

एक और तरीका है इस को देखने के लिए निम्न हो सकती है:

>>> myFunction = "hello" 
>>> abc = myFunction 
>>> def myFunction(): 
...  print "there" 
... 
>>> abc 
'hello' 
>>> myFunction 
<function myFunction at 0x63270> 
>>> myFunction() 
there 

आप देख सकते हैं, myFunction समारोह की परिभाषा सिर्फ प्रतीक myFunction के बंधन में परिवर्तन एक समारोह वस्तु के लिए।

+0

+1: बहुत स्पष्ट स्पष्टीकरण! – EOL

1

आप एक खाली फ़ंक्शन घोषित कर सकते हैं, इसका उपयोग गुणों या इस तरह के किसी भी सेट को सेट करने के लिए कर सकते हैं, और फिर उसके कोड को बाद में संशोधित कर सकते हैं।

def myFunction(): 
    pass 

myFunction.foo = 'bar' 

def makeFunction(obj): 
    def myFunction(): 
     print "123" 

    f = myFunction 
    for attr in dir(obj): 
     if attr not in dir(f): 
      setattr(f, attr, getattr(obj, attr)) 

    return f 


myFunction = makeFunction(myFunction) 
myFunction() 
print myFunction.foo 
1

के रूप में यह किसी भी नाम के लिए किसी भी संदर्भ (टोकन कि एक वैध चर/कक्षा/समारोह/वस्तु नाम है) जिसके लिए वहाँ था कोई पिछले बंधन का सामना करना पड़ता अजगर एक NameError बढ़ा देंगे।

पायथन दुभाषिया फ़ाइल के स्रोत कोड को निष्पादित करता है क्योंकि यह इसे पढ़ता है।इस प्रकार def foo(): वास्तव में कथन है जो foo() को परिभाषित करता है क्योंकि कोड लोड किया जा रहा है।

यह सोचना आसान है कि आगे के संदर्भ समर्थित हैं। इस पर विचार करें:

def foo(): 
    return abc 

abc="FooBar, Dude" 

print foo() 

... और आप देखेंगे कि इसे बिना किसी समस्या के चलाया जा सकता है। उद्धृत होने के रूप में foo() की परिभाषा के बारे में सोचना सबसे अच्छा है। फ़ंक्शन का आह्वान होने तक सामग्री का मूल्यांकन नहीं किया जाता है। तो नेमइरर उठाया नहीं जाता है (जब तक कुछ मान फ़ंक्शन पर कॉल से पहले "एबीसी" नाम से बंधे होते हैं।

ध्यान दें कि इनमें से कुछ अर्थशास्त्र जावा, सी जैसी भाषाओं से काफी अलग हैं/सी ++, और पर्ल कि पाइथोनिस्टस अक्सर थोड़ा अलग शब्दावली का उपयोग करना पसंद करते हैं। चर और इसे "नाम" कहा जाता है और मूल्यों (या अधिक आम तौर पर, वस्तुओं) के साथ जोड़ने की प्रक्रिया को "बाध्यकारी" कहा जाता है। तो इसके बजाय "चर के मान निर्दिष्ट" आप कर रहे हैं "के नाम करने के लिए बाध्यकारी वस्तुओं।"

अनौपचारिक रूप से नाम, विशेष रूप से सरल संख्यात्मक या स्ट्रिंग वस्तुओं के लिए, "चर" और इस तरह के रूप में x='foo' बयान कहा जाता है कार्य के रूप में भेजा जाता है। अर्थ विज्ञान आमतौर पर कर रहे हैं उतना ही पर्याप्त है कि हम डब्ल्यू परवाह नहीं है

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

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