पायथन में प्रकार संकेत के साथ डिफ़ॉल्ट पैरामीटर मान जोड़ना


236

अगर मेरे पास इस तरह का कोई कार्य है:

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

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

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

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

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

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

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

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

4
अंतिम कार्य सही तरीका है। यह उसी तरह है जैसे scalaभाषा भी करती है।
इज़राइल Unterman

14
आपके पास एक परिवर्तनशील डिफ़ॉल्ट प्रकार है - जो समस्याओं को जन्म देगा
noɐɹƆz

मेरा अपडेट उत्तर देखें, @ जोश
noɥʇʎԀʎz '

@ no @z mem जब तक आप इसके लिए उपयोग नहीं कर रहे हैं, उदाहरण के लिए। : पी
मतीन उलहक

जवाबों:


281

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

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

print(foo.__annotations__)

यह आउटपुट है

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

यह सही है कि यह पीईपी 484 में सूचीबद्ध नहीं है , लेकिन टाइप संकेत फ़ंक्शन एनोटेशन का एक अनुप्रयोग है, जो पीईपी 3107 में प्रलेखित हैं । वाक्यविन्यास अनुभाग यह स्पष्ट करता है कि कीवर्ड तर्क फ़ंक्शन एनोटेशन के साथ इस तरह से काम करते हैं।

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


1
Legacy.python.org/dev/peps/pep-3107/#syntax देखें । टाइप हिंटिंग केवल फ़ंक्शन एनोटेशन का एक अनुप्रयोग है।
Chepner

@ चेचक सच। पता नहीं था कि PEP 3107 में कीवर्ड तर्क के बारे में कुछ था।
no --zɐɹƆ

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

6
मुझे हमेशा {} या [] या एक डिफ़ॉल्ट वस्तु की तरह एक उत्परिवर्तित प्रकार के बजाय किसी भी वस्तु का उपयोग करने की सलाह दी गई थी, एक गहरी प्रति के बिना म्यूटेशन के रूप में पुनरावृत्तियों के बीच बनी रहेगी।
MrMesees

2
परिवर्तनशील कीवर्ड दलीलों के साथ पर्याप्त कार्यों को परिभाषित करें और यह केवल समय की बात है इससे पहले कि आप अपने आप को एक 4 घंटे डिबगिंग सत्र पर वापस देख लें, जो आपके जीवन विकल्पों पर सवाल उठा रहा है
जोसेफ शीडी

20

यदि आप टाइपिंग का उपयोग कर रहे हैं (पायथन 3.5 में पेश किया गया है) तो आप इसका उपयोग कर सकते हैं typing.Optional, जहां Optional[X]के बराबर है Union[X, None]। इसका उपयोग यह संकेत देने के लिए किया जाता है कि स्पष्ट मूल्य की Noneअनुमति है। टाइपिंग से। वैकल्पिक :

def foo(arg: Optional[int] = None) -> None:
    ...

2
वहाँ के आसपास कोई खाली स्थान के नहीं होना चाहिए =में Optional[int] = Noneहै जैसे कि यह गैर प्रकार का संकेत दिया कीवर्ड तर्क के लिए सम्मेलन है?
वास्तविक_पंडा

7

मैंने हाल ही में इस वन-लाइनर को देखा:

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

हाय @Kirkalicious, आपके उत्तर के लिए धन्यवाद। क्या आप बता सकते हैं कि यह कैसे काम करता है?
नाथन

1
डिफॉल्ट पैरामीटर के रूप में खाली खाली डिक्लेयर हर कॉल के लिए समान है। इसलिए यदि फ़ंक्शन इसे बदल देता है, तो अगली बार डिफ़ॉल्ट पिछली बार से उत्परिवर्तित मूल्य होगा। Noneडिफॉल्ट करना और फिर विधि के अंदर जांच करना , हर बार विधि लागू होने पर एक नया डिक्टेट आवंटित करके इस समस्या से बचा जाता है।
इयान गोल्डबी
हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.