पायथन में एकल अंडरस्कोर "_" चर का उद्देश्य क्या है?


618

इस कोड के _बाद का अर्थ क्या है for?

if tbh.bag:
   n = 0
   for _ in tbh.bag.atom_set():
      n += 1


5
आपके मामले के लिए, यह या तो क्लीनर होगा len(tbh.bag.atom_set())(यदि लौटाए गए मूल्य में एक __len__विधि है) याsum(1 for _ in tbh.bag.atom_set())
निक टी

में pylintडमी चर नाम के लिए एक और विकल्प का एक उपसर्ग है dummy_चर नाम के लिए। इस उपसर्ग का उपयोग करना pylint, pylintचेतावनी का उत्सर्जन नहीं करता है। इसके अलावा, आप pylintचीजों को व्यवस्थित करने के लिए डमी चर पैटर्न को कॉन्फ़िगर कर सकते हैं __
ट्रेवर बॉयड स्मिथ

जवाबों:


780

_ पायथन में 4 मुख्य पारंपरिक उपयोग हैं:

  1. एक इंटरैक्टिव दुभाषिया सत्र में अंतिम निष्पादित अभिव्यक्ति (/ बयान) के परिणाम को धारण करने के लिए। यह मिसाल मानक CPython दुभाषिया द्वारा निर्धारित की गई थी, और अन्य दुभाषियों ने सूट का पालन किया है
  2. I18n में अनुवाद देखने के लिए ( उदाहरण के लिए गेटेक्ट प्रलेखन देखें ), जैसे कोड में: raise forms.ValidationError(_("Please enter a correct username"))
  3. एक सामान्य उद्देश्य के रूप में "थ्रोअवे" वैरिएबल नाम यह इंगित करने के लिए कि फ़ंक्शन परिणाम के भाग को जानबूझकर अनदेखा किया जा रहा है (वैचारिक रूप से, इसे खारिज किया जा रहा है।), जैसे कोड में label, has_label, _ = text.partition(':'):।
  4. एक समारोह परिभाषा के भाग के रूप (या तो का उपयोग कर defया lambda), जहां हस्ताक्षर तय हो गई है (उदाहरण के द्वारा एक कॉलबैक या अभिभावक वर्ग एपीआई), लेकिन इस विशेष समारोह कार्यान्वयन, मानकों के सभी की जरूरत नहीं है की तरह कोड के रूप में:callback = lambda _: True

(लंबे समय तक इस उत्तर ने केवल पहले तीन उपयोग मामलों को सूचीबद्ध किया, लेकिन चौथा मामला अक्सर पर्याप्त था, जैसा कि यहां स्पष्ट रूप से सूचीबद्ध करने के लिए पर्याप्त है )

उत्तरार्द्ध "थ्रोअवे वैरिएबल या पैरामीटर नाम" का उपयोग करता है, केस ट्रांसलेशन लुकअप केस के साथ संघर्ष कर सकते हैं, इसलिए _किसी भी कोड ब्लॉक में थ्रोअवे वैरिएबल के रूप में उपयोग करने से बचना आवश्यक है जो इसे i18n अनुवाद के लिए भी उपयोग करता है (कई लोग एक डबल-अंडरस्कोर पसंद करते हैं , __बिल्कुल इस कारण के लिए उनके फेंकने के चर के रूप में)।


19
क्या आप बता सकते हैं कि यह फ़ंक्शन कॉल में कैसे काम करता है, उदाहरण के लिए: फॉर्म बढ़ाएं। अमान्यकरण (_ ("कृपया सही उपयोगकर्ता नाम दर्ज करें")) । मैंने इसे Django कोड में देखा है, और यह स्पष्ट नहीं है कि क्या चल रहा है।
जॉन सी

41
यह 2 उपयोग है - सम्मेलन द्वारा, _उस फ़ंक्शन के लिए उपयोग किया जाने वाला नाम है जो अंतर्राष्ट्रीयकरण और स्थानीयकरण स्ट्रिंग अनुवाद लुकअप करता है। मुझे पूरा यकीन है कि यह सी gettextलाइब्रेरी है जिसने उस सम्मेलन की स्थापना की।
ncoghlan

43
एफडब्ल्यूआईडब्ल्यू, मैंने व्यक्तिगत __रूप से (एक डबल अंडरस्कोर) का उपयोग करना शुरू कर दिया है, क्योंकि मेरा सामान्य उद्देश्य फेंकने वाला चर पहले दो उपयोग मामलों में से किसी एक के साथ विरोध करने से बचने के लिए है।
ncoghlan

14
तत्काल सामुदायिक सम्मेलनों में आधिकारिक स्रोत नहीं होते - बस समय के साथ दिखाई देने वाली प्रथाओं का अवलोकन। FWIW, मैं हाल ही के PEP 8 अपडेट्स के सह-लेखकों में से एक हूं, और मेरा उत्तर उन 3 अलग-अलग तरीकों पर आधारित है, जिन्हें मैंने _एक चर नाम के रूप में इस्तेमाल किया है क्योंकि मैंने 2002 में पाइथन को पेशेवर रूप से उपयोग करना शुरू किया था।
ncoghlan

12
अधिवेशन मुख्य रूप से टपल अनपैकिंग के लिए होता है: a, __, c = iterableपाठक को तुरंत बताता है कि हम 3-टपल को अनपैक कर रहे हैं, लेकिन केवल पहले और अंतिम मान का उपयोग कर रहे हैं। अगर हम बजाय लिखने a, b, c = iterable, पाठक (या एक स्वचालित कोड लिंटर) यथोचित के सभी उम्मीद कर सकते हैं a, bऔर cबाद में प्रयोग की जाने वाली (और यदि वे नहीं कर रहे हैं, यह एक बग कहीं का संकेत हो सकता है)।
ncoghlan

207

यह सिर्फ एक चर नाम है, और यह पायथन में पारंपरिक रूप से _फेंकने योग्य चर के लिए उपयोग होता है । यह केवल इंगित करता है कि लूप वेरिएबल वास्तव में उपयोग नहीं किया गया है।


5
आपका मतलब है कि यह अंतिम लौटे मूल्य का प्रतिनिधित्व नहीं करता है?
alwbtc

31
@ जल्द ही एक अजगर के गोले में
गेबी पुरकारू

4
प्रोलॉग में _ के उपयोग के समान
मथायस

3
Matlab में ~ के उपयोग के समान है
PatriceG

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

78

अंडरस्कोर _को पायथन में "आई डोंट केयर " या " थ्रोवेवे " चर माना जाता है

  • अजगर दुभाषिया अंतिम अभिव्यक्ति मान को विशेष चर में संग्रहीत करता है _

    >>> 10 
    10
    
    >>> _ 
    10
    
    >>> _ * 3 
    30
  • अंडरस्कोर _का उपयोग विशिष्ट मूल्यों की अनदेखी के लिए भी किया जाता है। यदि आपको विशिष्ट मानों की आवश्यकता नहीं है या मानों का उपयोग नहीं किया जाता है, तो बस मानों को अंडरस्कोर करने के लिए असाइन करें।

    अनपैक करते समय किसी मान को अनदेखा करें

    x, _, y = (1, 2, 3)
    
    >>> x
    1
    
    >>> y 
    3

    सूचकांक को अनदेखा करें

    for _ in range(10):     
        do_something()

2
एक तीसरा उपयोग है, जो अंतर्राष्ट्रीयकरण समारोह के लिए है _("Hello world!")
जेफ यॉंकर

3
प्रोसेसर स्तर पर, क्या "रेंज में _ के लिए" और "रेंज में एक्स के लिए" और फिर एक्स का उपयोग नहीं करने के बीच वास्तव में अंतर है? या यह सिर्फ मानवीय पठनीयता के लिए है?
आईमैक्स

1
@iammax disमॉड्यूल का उपयोग करते हुए मैंने पाया कि बायटेकोड में कोई अंतर नहीं था। हालांकि मानव पठनीयता के लाभ स्पष्ट हैं।
एलिस्टेयर कार्सडेन

21

पायथन में अंडरस्कोर का उपयोग करने के लिए 5 मामले हैं।

  1. दुभाषिया में अंतिम अभिव्यक्ति के मूल्य को संग्रहीत करने के लिए।

  2. विशिष्ट मूल्यों की अनदेखी के लिए। (तथाकथित "मुझे परवाह नहीं है")

  3. वार्टीबल्स या फ़ंक्शंस के नाम पर विशेष अर्थ और फ़ंक्शन देने के लिए।

  4. 'अंतर्राष्ट्रीयकरण (i18n)' या 'स्थानीयकरण (l10n)' कार्यों के रूप में उपयोग करने के लिए।

  5. संख्या शाब्दिक मान के अंकों को अलग करने के लिए।

यहाँ मिंगरमेर द्वारा उदाहरण के साथ एक अच्छा लेख है ।


2
वास्तव में यह बहुत नया है blog.pythonlibrary.org/2017/01/11/...
MichaelChirico

3

जहां तक ​​पायथन भाषाओं का संबंध है, _इसका कोई विशेष अर्थ नहीं है। यह एक मान्य पहचानकर्ता की तरह है _foo, foo_या _f_o_o_

किसी भी विशेष का अर्थ _विशुद्ध रूप से सम्मेलन से है। कई मामले आम हैं:

  • एक डमी नाम जब एक चर का उपयोग करने का इरादा नहीं है, लेकिन सिंटैक्स / शब्दार्थ द्वारा एक नाम की आवश्यकता है।

    # iteration disregarding content
    sum(1 for _ in some_iterable)
    # unpacking disregarding specific elements
    head, *_ = values
    # function disregarding its argument
    def callback(_): return True
  • कई REPLs / गोले अंतिम शीर्ष-स्तरीय अभिव्यक्ति के परिणाम को संग्रहीत करते हैं builtins._

    _अंतिम मूल्यांकन के परिणाम को संग्रहीत करने के लिए इंटरएक्टिव इंटरप्रेटर में विशेष पहचानकर्ता का उपयोग किया जाता है; यह builtinsमॉड्यूल में संग्रहीत है । जब इंटरैक्टिव मोड में नहीं है, तो _इसका कोई विशेष अर्थ नहीं है और इसे परिभाषित नहीं किया गया है। [ स्रोत ]

    जिस तरह से नामों को देखा जाता है, जब तक कि एक वैश्विक या स्थानीय _परिभाषा के अनुसार नंगे को _संदर्भित नहीं किया जाता है builtins._

    >>> 42
    42
    >>> f'the last answer is {_}'
    'the last answer is 42'
    >>> _
    'the last answer is 42'
    >>> _ = 4  # shadow ``builtins._`` with global ``_``
    >>> 23
    23
    >>> _
    4

    नोट: कुछ गोले जैसे कि विशेष मामले के ipythonलिए निर्दिष्ट नहीं है ।builtins.__

  • संदर्भ में अंतर्राष्ट्रीयकरण और स्थानीयकरण, _प्राथमिक अनुवाद समारोह के लिए एक उपनाम के रूप में उपयोग किया जाता है।

    gettext.gettext (संदेश)

    वर्तमान वैश्विक डोमेन, भाषा और स्थानीय निर्देशिका के आधार पर, संदेश का स्थानीय अनुवाद लौटाएं। इस कार्य को आमतौर पर स्थानीय नामस्थान में _ () के रूप में उतारा जाता है (नीचे उदाहरण देखें)।

हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.