variable id ’पायथन में एक बुरा परिवर्तनशील नाम है


141

idपायथन में एक चर का नाम देना क्यों बुरा है ?


33
अधिकांश लोग पहचानकर्ताओं के लिए एक अंडरस्कोर जोड़ते हैं जो बिल्डरों / कीवर्ड के साथ टकराते हैं: id_, map_, list_, filter_, आदि
cdleary

3
चर का उपयोग करने के लिए एक अधिक डरपोक समाधान होगा ID
सिमोन कुआंग

46
एक बेहतर सवाल यह होगा ... क्या एक प्रतिभाशाली व्यक्ति ने एक अंतर्निहित कार्य के लिए इस तरह के एक सामान्य, सामान्य नाम का उपयोग करने के बारे में सोचा था?
बेसिक

जवाबों:


143

id() एक मौलिक अंतर्निहित है:

idमॉड्यूल में अंतर्निहित फ़ंक्शन पर मदद __builtin__:

id(...)

    id(object) -> integer

    Return the identity of an object.  This is guaranteed to be unique among
    simultaneously existing objects.  (Hint: it's the object's memory
    address.)

सामान्य तौर पर, किसी भी भाषा में कीवर्ड या बिल्ट-इन फ़ंक्शन को ग्रहण करने वाले चर नामों का उपयोग करना एक बुरा विचार है, भले ही इसकी अनुमति हो।


3
ठीक है, 'आईडी' के लिए आप सही हैं, लेकिन "सामान्य रूप से ..." टिप्पणी अभी भी लागू होती है, क्या आपको नहीं लगता?
केविन लिटिल

5
मैं निश्चित रूप से मॉड्यूल ग्लोबल्स के लिए इससे बचूंगा। चरों के लिए स्थानीय दायरे तक ही सीमित है, इसलिए आप देख सकते हैं कि एक ही फ़ंक्शन को कभी भी बिलिन का उपयोग करने की आवश्यकता नहीं है, यह ऐसा कुछ नहीं है जिसके बारे में मुझे चिंता होगी।
बॉबी

@ करमदिर: अच्छा कैच, idएक समय में हटाने के लिए स्लेट किया गया था, लेकिन अंततः उन्होंने इसे नहीं हटाने का फैसला किया। अब मैं अपनी मूल टिप्पणी संपादित नहीं कर पा रहा हूं, इसलिए भविष्य में लोगों को भ्रमित करने से बचने के लिए इसे हटा दूंगा।
एली कोर्टराइट

20
@EliCourtwright काश वे इसे हटा देते। क्या घटिया नाम वाला तरीका है! एक सामान्य, सामान्य नाम जो हजारों स्थानों पर उपयोग किया जाता है (जहाँ संदर्भ अर्थ देता है)। तो किसी ने इसे एक वैश्विक नाम के रूप में उपयोग करने का फैसला किया जहां कोई संदर्भ नहीं है?
बेसिक

2
आश्चर्यजनक रूप से, Google का अपना Python regex tutorial ( Developers.google.com/edu/python/ अनियमित-expressions ) उपयोग करता है str = 'an example word:cat!!'। क्या ऐसा करने वाले पीईपी में कुछ भी है जो ऐसा नहीं करता है?
शब्दफोरवाइज

57

में पीईपी 8 - अजगर कोड के लिए स्टाइल गाइड , अनुभाग में निम्न में मार्गदर्शन प्रकट होता है वर्णनात्मक: नामकरण शैलियाँ :

  • single_trailing_underscore_ : पाइथन कीवर्ड के साथ संघर्ष से बचने के लिए सम्मेलन द्वारा उपयोग किया जाता है, जैसे

    Tkinter.Toplevel(master, class_='ClassName')

इसलिए, इस प्रश्न का उत्तर देने के लिए, इस दिशानिर्देश को लागू करने वाला एक उदाहरण है:

id_ = 42

चर नाम में अनुगामी अंडरस्कोर शामिल करना इरादे को स्पष्ट करता है (पीईपी 8 में मार्गदर्शन से परिचित लोगों के लिए)।


1
यह वास्तविक सवाल का जवाब नहीं है, लेकिन पीईपी -8 नामकरण परंपरा के लिए +1
ege

अच्छी सलाह है, लेकिन idएक बिलिन है, एक कीवर्ड नहीं है, और यह नहीं बताता है कि एक बेसिन को छाया देना क्यों बुरा है।
वेजेंड्रिया

51

idएक अंतर्निहित फ़ंक्शन है जो किसी ऑब्जेक्ट की पहचान देता है (जो कि सीपीथॉन में इसका मेमोरी एड्रेस भी है)। यदि आप अपने कार्यों में से एक का नाम देते हैं id, तो आपको builtins.idमूल (या __builtins__.idसीपीथॉन में) प्राप्त करने के लिए कहना होगा । idविश्व स्तर पर नामकरण एक छोटी सी स्क्रिप्ट में कुछ भी भ्रमित करने वाला है।

हालाँकि, निर्मित नामों को चर के रूप में पुन: उपयोग करना तब तक बुरा नहीं है जब तक उपयोग स्थानीय है। पायथन में बहुत सारे बिल्ट-इन फ़ंक्शंस हैं (1) जिनके सामान्य नाम हैं और (2) आप वैसे भी ज़्यादा इस्तेमाल नहीं करेंगे। स्थानीय चर के रूप में या किसी वस्तु के सदस्यों के रूप में इनका उपयोग करना ठीक है क्योंकि यह इस संदर्भ से स्पष्ट है कि आप क्या कर रहे हैं:

उदाहरण:

def numbered(filename):
    with open(filename) as file:
        for i, input in enumerate(file):
            print("%s:\t%s" % (i, input), end='')

लुभावने नामों के साथ कुछ बिल्ट-इन:

  • id
  • file
  • list, dict
  • map
  • all, any
  • complex, int
  • dir
  • input
  • slice
  • buffer
  • sum
  • min, max
  • object

8
PEP 8 , जिसे 01-अगस्त -2013 को अद्यतन किया गया था, अब केवल _चर नाम के साथ जोड़कर संभावित भ्रम से बचने की सलाह देता है । कृपया मेरा उत्तर देखें ।
डेविडआरआर

1
यह ध्यान देने योग्य है कि idकिसी ऑब्जेक्ट का मेमोरी एड्रेस लौटाने वाला फ़ंक्शन CPython कार्यान्वयन विवरण है। यह भी ध्यान देने योग्य बात है कि समारोह केवल किसी भी दो के लिए एक अलग संख्या वापस जाने के लिए आवश्यक है लायक है मौजूदा वस्तुओं। यदि कोई वस्तु कचरा एकत्र किया जाता है, तो उसकी आईडी को पुनर्नवीनीकरण किया जा सकता है।
Zac Crites

@Zac धन्यवाद! मैंने स्मृति पते के बारे में उस बिंदु को जोड़ने का उत्तर संपादित किया, और एक लिंक ताकि लोग अधिक पढ़ सकें।
1

42

मैं यहां कुछ अलोकप्रिय कह सकता हूं: id()यह एक विशेष रूप से निर्मित फ़ंक्शन है जो शायद ही कभी व्यावसायिक तर्क में उपयोग किया जाता है। इसलिए मुझे एक तंग और अच्छी तरह से लिखित फ़ंक्शन में एक चर नाम के रूप में इसका उपयोग करने में कोई समस्या नहीं दिखाई देती है, जहां यह स्पष्ट है कि आईडी का मतलब अंतर्निहित फ़ंक्शन नहीं है।


1
के जवाब में:> आईडी एक विशेष रूप से निर्मित इन-फंक्शन है, जिसका उपयोग शायद ही कभी> बिजनेस लॉजिक में किया जाता है। इसलिए मैं इसे एक तंग और अच्छी तरह से लिखित> फ़ंक्शन में चर के रूप में उपयोग करने में कोई समस्या नहीं देख रहा हूं, यह स्पष्ट है कि आईडी> अंतर्निहित फ़ंक्शन का मतलब नहीं है। हालांकि यह सच है, बस "आईडी" की तुलना में इस चर नाम के साथ अधिक विशिष्ट होना संभवतः एक अच्छा विचार है। बहुत सी चीजों की आईडी है (विशेषकर यदि आप RDBMS के साथ काम कर रहे हैं), और टिम पीटर्स की द ज़ेन ऑफ पायथन की दूसरी पंक्ति हमें बताती है:> स्पष्ट रूप से निहितार्थ से बेहतर है। बाकी को चलाकर देखें:import this
रॉस

9
मैं फिर भी अगर संभव हो तो इसे टाल दूंगा। भले ही सहकर्मियों की शिकायत न सुनने के अलावा और कोई कारण न हो। :-)
जेसन बेकर

1
मैं पूरी तरह से सहमत हूं: एक छोटे समारोह में एक चर "आईडी" नामकरण (और इस तरह गुंजाइश) हानिरहित है। idवैसे भी बहुत कम लोग बिल्टिन का उपयोग करते हैं । यह कहा कि मुझे एक समय लगा जब एक सहयोगी ने listस्थानीय चर के साथ बिलिन को ओवररोड किया। तो अन्य लोगों का उल्लेख सामान्य नियम अभी भी समझ में आता है।
सिल्वोट

5

बिल्ट इन फंक्शन के बाद किसी भी वैरिएबल को नाम देना बुरा है। कारणों में से एक यह है कि यह एक पाठक को भ्रमित कर सकता है जिसे पता नहीं है कि नाम ओवरराइड है।


2

idपायथन में एक अंतर्निहित कार्य है। idफ़ंक्शन को ओवरराइड करने के लिए मान निर्दिष्ट करना। या तो एक उपसर्ग जोड़ना सबसे अच्छा है या some_idइसे एक अलग पूंजीकरण में उपयोग करना है ID

अंतर्निहित फ़ंक्शन एक एकल तर्क लेता है और उस ऑब्जेक्ट के मेमोरी एड्रेस के लिए एक पूर्णांक देता है जिसे आपने (CPython में) पास किया था।

>>> id(1)
9787760
>>> x = 1
>>> id(x)
9787760

2
ध्यान दें कि आप एक क्लास एट्रीब्यूट या मेथड 'id' नाम दे सकते हैं, जो बिल्ट इन फंक्शन को टच नहीं करेगा।
टोनी रुइजा

0

क्योंकि यह एक बिलियन फ़ंक्शन का नाम है।


0

दूसरों उल्लेख किया है कि यह भ्रामक है, लेकिन मैं पर विस्तार करना चाहते क्यों । यहाँ एक उदाहरण है, एक सच्ची कहानी पर आधारित। मूल रूप से, मैं एक वर्ग लिखता हूं जो एक idपैरामीटर लेता है लेकिन फिर idबाद में बिलिन का उपयोग करने का प्रयास करता है ।

class Employee:
    def __init__(self, name, id):
        """Create employee, with their name and badge id."""
        self.name = name
        self.id = id
        # ... lots more code, making you forget about the parameter names
        print('Created', type(self).__name__, repr(name), 'at', hex(id(self)))

tay = Employee('Taylor Swift', 1985)

अपेक्षित उत्पादन:

Created Employee 'Taylor Swift' at 0x7efde30ae910

वास्तविक उत्पादन:

Traceback (most recent call last):
  File "company.py", line 9, in <module>
    tay = Employee('Taylor Swift', 1985)
  File "company.py", line 7, in __init__
    print('Created', type(self).__name__, repr(name), 'at', hex(id(self)))
TypeError: 'int' object is not callable

है ना? मैं इंट को कॉल करने की कोशिश कहां कर रहा हूं? वे सभी भवन हैं ...

अगर मैंने इसे नाम दिया badge_idया id_, मुझे यह समस्या नहीं हुई।


-6

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


3
"क्योंकि अजगर एक गतिशील भाषा है, यह आमतौर पर एक चर और एक ही नाम देने के लिए एक अच्छा विचार नहीं है।" - आप एक चर और फ़ंक्शन एक ही नाम नहीं दे सकते। इसका गतिशील भाषा होने से कोई लेना-देना नहीं है। यदि आप गुणों को समान दायरे में अन्य वस्तुओं के समान नाम देते हैं , तो मैं भी असहमत हूं। आपके पास "कुंजी" नामक एक वर्ग हो सकता है, उस वर्ग का उदाहरण "कुंजी" और "कुंजी" नामक किसी अन्य ऑब्जेक्ट की संपत्ति, उदाहरण के लिए, "door.key"।
6
हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.