2016-08-02 12 views
42

में टाइप संकेत के साथ डिफ़ॉल्ट पैरामीटर मान जोड़ना अगर मैं इस तरह एक समारोह है:अजगर

def foo(name, opts={}): 
    pass 

और मैं मापदंडों के प्रकार संकेत जोड़ना चाहते हैं, मैं यह कैसे करते हो? जिस तरह से मैं मान लिया है मुझे एक सिंटैक्स त्रुटि देता है:

def foo(name: str, opts={}: dict) -> str: 
    pass 

निम्नलिखित सिंटैक्स त्रुटि फेंक नहीं है, लेकिन यह इस मामले को संभालने के लिए सहज तरीके से की तरह प्रतीत नहीं होता:

def foo(name: str, opts: dict={}) -> str: 
    pass 

मैं कर सकते हैं typing documentation या Google खोज पर कुछ भी नहीं मिला।

संपादित करें: मुझे नहीं पता था कि पाइथन में डिफ़ॉल्ट तर्क कैसे काम करते थे, लेकिन इस प्रश्न के लिए, मैं ऊपर दिए गए उदाहरण रखूंगा। आम तौर पर निम्नलिखित करने के लिए यह बेहतर होता है:

def foo(name: str, opts: dict=None) -> str: 
    if not opts: 
    opts={} 
    pass 
+1

अंतिम कार्य सही तरीका है। यह वैसे ही 'स्कैला' भाषा भी करता है। –

+4

आपके पास एक म्यूटेबल डिफ़ॉल्ट प्रकार है - इससे समस्याएं उत्पन्न हो सकती हैं –

+0

मेरा अपडेट उत्तर देखें, @josh –

उत्तर

52

आपका दूसरा तरीका सही है।

def foo(opts: dict = {}): 
    pass 

print(foo.__annotations__) 

इस आउटपुट

{'opts': <class 'dict'>} 

यह सच है कि यह PEP 484 में सूचीबद्ध नहीं है, लेकिन प्रकार संकेत समारोह टिप्पणी है, जो पीईपी में दर्ज कर रहे हैं के लिए एक आवेदन कर रहे हैं 3107. The syntax section यह है कि स्पष्ट कीवर्ड तर्क काम करता है बनाता है इस तरह से समारोह एनोटेशन के साथ।

मैं दृढ़ता से कीवर्ड तर्कों का उपयोग करने के खिलाफ दृढ़ता से सलाह देता हूं। अधिक जानकारी here

+1

http://legacy.python.org/dev/peps/pep-3107/#syntax देखें। टाइपिंग संकेत केवल फ़ंक्शन एनोटेशन का एक एप्लीकेशन है। – chepner

+0

@chepner सच। पता नहीं था कि पीईपी 3107 में कीवर्ड तर्कों के बारे में कुछ था। –

+1

वाह, मुझे पायथन में परिवर्तनीय डिफ़ॉल्ट तर्कों के बारे में पता नहीं था ... विशेष रूप से जावास्क्रिप्ट/रूबी से आ रहा है जहां डिफ़ॉल्ट तर्क अलग-अलग काम करते हैं। एसओ के आस-पास विज्ञापन मतली जो पहले से ही कहा जा रहा है, उसे दोबारा नहीं करने के लिए, मुझे खुशी है कि इससे पहले मुझे थोड़ा सा पता चला। धन्यवाद! – josh