পাইথনে একক আন্ডারস্কোর “_” ভেরিয়েবলের উদ্দেশ্য কী?


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. ইন্টারেক্টিভ ইন্টারপ্রেটার সেশনে শেষ সম্পাদিত এক্সপ্রেশন (/ স্টেটমেন্ট) এর ফলাফলটি ধরে রাখা। এই নজিরটি স্ট্যান্ডার্ড সিপিথন ইন্টারপ্রেটার দ্বারা সেট করা হয়েছিল এবং অন্যান্য দোভাষীরাও তার অনুসারী হয়েছেন
  2. আই 18 এ অনুবাদ অনুসন্ধানের জন্য ( উদাহরণস্বরূপ গেটেক্সট ডকুমেন্টেশন দেখুন ), যেমন কোডে: raise forms.ValidationError(_("Please enter a correct username"))
  3. একটি সাধারণ উদ্দেশ্য হিসেবে "বিজ্ঞাপন" পরিবর্তনশীল নাম, ইঙ্গিত একটি ফাংশন ফলাফলের সেই অংশে ইচ্ছাকৃতভাবে উপেক্ষা করা হচ্ছে হয় (ধারণার দিক থেকে, এটা বাতিল করা হচ্ছে।) মত কোড হিসাবে: label, has_label, _ = text.partition(':')
  4. কোনও ফাংশন সংজ্ঞার অংশ হিসাবে (হয় defবা ব্যবহার করে lambda), যেখানে স্বাক্ষর স্থির করা হয়েছে (যেমন একটি কলব্যাক বা প্যারেন্ট ক্লাস এপিআই দ্বারা), তবে এই নির্দিষ্ট ফাংশন বাস্তবায়নের জন্য কোডগুলির মতো এই সমস্ত পরামিতিগুলির প্রয়োজন হয় না:callback = lambda _: True

(দীর্ঘদিনের জন্য এই উত্তরটি কেবলমাত্র প্রথম তিনটি ব্যবহারের ক্ষেত্রে তালিকাভুক্ত করেছে, তবে চতুর্থ ক্ষেত্রে প্রায়শই যথেষ্ট পরিমাণে উপস্থিত হয়েছিল, যেমন এখানে উল্লেখ করা হয়েছে , সুস্পষ্টভাবে তালিকাভুক্ত করার যোগ্য হতে হবে)

পরের "থ্রোওয়ে ভেরিয়েবল বা প্যারামিটার নাম" কেস ব্যবহার করে অনুবাদ অনুসন্ধানের ক্ষেত্রে দ্বন্দ্ব দেখাতে পারে, সুতরাং _আইডেন অনুবাদে এটি যে কোনও কোড ব্লকের ক্ষেত্রেও ব্যবহার করা উচিত নয় যা এটিকে ব্যবহার করে (অনেক লোকেরা একটি ডাবল-আন্ডারস্কোর পছন্দ করে) ,, __ঠিক এই কারণে তাদের বহনযোগ্য ভেরিয়েবল হিসাবে)।


19
এটি কীভাবে কোনও ফাংশন কলের সাথে কাজ করে তা ব্যাখ্যা করতে পারেন, উদাহরণস্বরূপ: ফর্মগুলি উত্থাপন করুন Vভ্যালিডেশনআরার (_ ("দয়া করে একটি সঠিক ব্যবহারকারীর নাম লিখুন")) । আমি এটি জ্যাঙ্গো কোডে দেখেছি এবং কী চলছে তা পরিষ্কার নয়।
জন সি

41
এটি হ'ল ব্যবহার 2 - কনভেনশন অনুসারে, _এই নামটি সেই ফাংশনটির জন্য ব্যবহৃত হয় যা আন্তর্জাতিকীকরণ এবং স্থানীয়করণের স্ট্রিং ট্রান্সলেশন লকআপস করে। আমি নিশ্চিত যে এটি সি gettextলাইব্রেরিই এই সম্মেলনটি প্রতিষ্ঠা করেছিল।
এনকোঘ্লান

43
এফডব্লিউআইডাব্লু, __প্রথম দুটি ব্যবহারের ক্ষেত্রে যে কোনও একটির সাথে দ্বন্দ্ব এড়াতে আমি ব্যক্তিগতভাবে আমার (সাধারণ ডাবল আন্ডারস্কোর) ব্যবহার করতে শুরু করেছি ।
এনকোঘ্লান

14
জরুরী সম্প্রদায়ের সম্মেলনগুলির কাছে প্রামাণিক উত্সগুলি থাকে না - কেবল সময়ের সাথে প্রদর্শিত অভ্যাসগুলির পর্যবেক্ষণ। এফডাব্লুআইডাব্লু, আমি আরও সাম্প্রতিক পিইপি 8 আপডেটের সহ-লেখকদের একজন এবং আমার উত্তরটি _২০০২ সালে আমি পাইথনকে
পেশাদারভাবে

12
কনভেনশনটি মূলত টুপল আনপ্যাকিংয়ের জন্য: a, __, c = iterableপাঠককে তাত্ক্ষণিকভাবে বলে যে আমরা 3-টুপল আনপ্যাক করছি, তবে কেবল প্রথম এবং শেষ মানগুলি ব্যবহার করছি। আমরা যদি এর পরিবর্তে লিখুন a, b, c = iterable, পাঠক (অথবা একটি স্বয়ংক্রিয় কোড Linter) যুক্তিসঙ্গতভাবে সব আশা করতে পারেন a, bএবং cপরে ব্যবহার করা হবে (এবং যদি তারা না হন, এটি একটি বাগ সংশোধন কোথাও একটি চিহ্ন হতে পারে)।
ncoghlan

207

এটি কেবল একটি পরিবর্তনশীল নাম, এবং _নিক্ষিপ্ত ভেরিয়েবলের জন্য অজগরটিতে এটি প্রচলিত । এটি কেবল ইঙ্গিত করে যে লুপ ভেরিয়েবলটি আসলে ব্যবহৃত হয় না।


5
আপনি বলতে চাচ্ছেন যে এটি শেষ ফেরত মানটি উপস্থাপন করে না?
alwbtc

31
@ কেবলমাত্র একটি অজগর শেলের
মধ্যেই রাখুন

4
প্রোলগে _ এর ব্যবহারের মতো
ম্যাথিয়াস


মনে রাখবেন যে সিপিথন শেলটিতে আপনি স্পষ্টভাবে সংজ্ঞা _দিলে এটি পূর্বের এক্সপ্রেশনটির আউটপুট মান স্থায়ীভাবে থামিয়ে দেয়। এটি মারাত্মকভাবে বেমানান বলে মনে হচ্ছে এবং পাইথন ল্যাং স্ট্যান্ডার্ডগুলির এটি সমাধান করা দরকার। তাদের কেবল _একটি নিক্ষিপ্ত নাম হিসাবে সংজ্ঞায়িত করা উচিত এবং এটিকে সত্য সনাক্তকারী হিসাবে ব্যবহার করা থেকে বিরত রাখা উচিত।
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!")
জেফ Younker

3
প্রসেসর স্তরে, আসলে "রেঞ্জের জন্য _" এবং "এক্স ইন রেঞ্জ" এবং তারপরে এক্স ব্যবহার না করার মধ্যে কি পার্থক্য রয়েছে? নাকি এটি কেবল মানুষের পাঠযোগ্যতার জন্য?
iammax

1
@iammax disমডিউলটি ব্যবহার করে আমি পেয়েছি বাইটোকোডে কোনও পার্থক্য নেই। মানুষের পাঠযোগ্যতার সুবিধাগুলি অবশ্য স্পষ্ট।
অ্যালিস্টায়ার কারস্কাডেন

21

পাইথনে আন্ডারস্কোর ব্যবহারের জন্য 5 টি মামলা রয়েছে।

  1. দোভাষীর সর্বশেষ প্রকাশের মান সংরক্ষণ করার জন্য।

  2. নির্দিষ্ট মানগুলিকে উপেক্ষা করার জন্য। (তথাকথিত "আমি যত্ন করি না")

  3. ভেরিয়েবল বা ফাংশনগুলির বিশেষ অর্থ এবং ফাংশন দেওয়া।

  4. 'আন্তর্জাতিকীকরণ (i18n)' বা 'স্থানীয়করণ (l10n)' ফাংশন হিসাবে ব্যবহার করতে।

  5. আক্ষরিক মানের সংখ্যার আলাদা করতে।

এখানে মিংগ্রামার দ্বারা উদাহরণ সহ একটি দুর্দান্ত নিবন্ধ ।


2
আসলে এটা প্রশংসনীয় নতুন blog.pythonlibrary.org/2017/01/11/...
MichaelChirico

3

পাইথন ভাষাগুলির সাথে সম্পর্কিত _কোনও বিশেষ অর্থ নেই special এটা একটা বৈধ আইডেন্টিফায়ার ঠিক _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 (বার্তা)

    বর্তমান বিশ্বব্যাপী ডোমেন, ভাষা এবং স্থানীয় ডিরেক্টরি অনুসারে বার্তাটির স্থানীয় অনুবাদ অনুবাদ করুন। এই ফাংশনটি সাধারণত স্থানীয় নামস্থানে _ () হিসাবে আলাদা করা হয় (নীচের উদাহরণগুলি দেখুন)।

আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.