idपायथन में एक चर का नाम देना क्यों बुरा है ?
ID।
idपायथन में एक चर का नाम देना क्यों बुरा है ?
ID।
जवाबों:
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.)
सामान्य तौर पर, किसी भी भाषा में कीवर्ड या बिल्ट-इन फ़ंक्शन को ग्रहण करने वाले चर नामों का उपयोग करना एक बुरा विचार है, भले ही इसकी अनुमति हो।
idएक समय में हटाने के लिए स्लेट किया गया था, लेकिन अंततः उन्होंने इसे नहीं हटाने का फैसला किया। अब मैं अपनी मूल टिप्पणी संपादित नहीं कर पा रहा हूं, इसलिए भविष्य में लोगों को भ्रमित करने से बचने के लिए इसे हटा दूंगा।
str = 'an example word:cat!!'। क्या ऐसा करने वाले पीईपी में कुछ भी है जो ऐसा नहीं करता है?
में पीईपी 8 - अजगर कोड के लिए स्टाइल गाइड , अनुभाग में निम्न में मार्गदर्शन प्रकट होता है वर्णनात्मक: नामकरण शैलियाँ :
single_trailing_underscore_: पाइथन कीवर्ड के साथ संघर्ष से बचने के लिए सम्मेलन द्वारा उपयोग किया जाता है, जैसे
Tkinter.Toplevel(master, class_='ClassName')
इसलिए, इस प्रश्न का उत्तर देने के लिए, इस दिशानिर्देश को लागू करने वाला एक उदाहरण है:
id_ = 42
चर नाम में अनुगामी अंडरस्कोर शामिल करना इरादे को स्पष्ट करता है (पीईपी 8 में मार्गदर्शन से परिचित लोगों के लिए)।
idएक बिलिन है, एक कीवर्ड नहीं है, और यह नहीं बताता है कि एक बेसिन को छाया देना क्यों बुरा है।
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='')
लुभावने नामों के साथ कुछ बिल्ट-इन:
idfilelist, dictmapall, anycomplex, intdirinputslicebuffersummin, maxobject_चर नाम के साथ जोड़कर संभावित भ्रम से बचने की सलाह देता है । कृपया मेरा उत्तर देखें ।
idकिसी ऑब्जेक्ट का मेमोरी एड्रेस लौटाने वाला फ़ंक्शन CPython कार्यान्वयन विवरण है। यह भी ध्यान देने योग्य बात है कि समारोह केवल किसी भी दो के लिए एक अलग संख्या वापस जाने के लिए आवश्यक है लायक है मौजूदा वस्तुओं। यदि कोई वस्तु कचरा एकत्र किया जाता है, तो उसकी आईडी को पुनर्नवीनीकरण किया जा सकता है।
मैं यहां कुछ अलोकप्रिय कह सकता हूं: id()यह एक विशेष रूप से निर्मित फ़ंक्शन है जो शायद ही कभी व्यावसायिक तर्क में उपयोग किया जाता है। इसलिए मुझे एक तंग और अच्छी तरह से लिखित फ़ंक्शन में एक चर नाम के रूप में इसका उपयोग करने में कोई समस्या नहीं दिखाई देती है, जहां यह स्पष्ट है कि आईडी का मतलब अंतर्निहित फ़ंक्शन नहीं है।
import this
idवैसे भी बहुत कम लोग बिल्टिन का उपयोग करते हैं । यह कहा कि मुझे एक समय लगा जब एक सहयोगी ने listस्थानीय चर के साथ बिलिन को ओवररोड किया। तो अन्य लोगों का उल्लेख सामान्य नियम अभी भी समझ में आता है।
बिल्ट इन फंक्शन के बाद किसी भी वैरिएबल को नाम देना बुरा है। कारणों में से एक यह है कि यह एक पाठक को भ्रमित कर सकता है जिसे पता नहीं है कि नाम ओवरराइड है।
idपायथन में एक अंतर्निहित कार्य है। idफ़ंक्शन को ओवरराइड करने के लिए मान निर्दिष्ट करना। या तो एक उपसर्ग जोड़ना सबसे अच्छा है या some_idइसे एक अलग पूंजीकरण में उपयोग करना है ID।
अंतर्निहित फ़ंक्शन एक एकल तर्क लेता है और उस ऑब्जेक्ट के मेमोरी एड्रेस के लिए एक पूर्णांक देता है जिसे आपने (CPython में) पास किया था।
>>> id(1)
9787760
>>> x = 1
>>> id(x)
9787760
दूसरों उल्लेख किया है कि यह भ्रामक है, लेकिन मैं पर विस्तार करना चाहते क्यों । यहाँ एक उदाहरण है, एक सच्ची कहानी पर आधारित। मूल रूप से, मैं एक वर्ग लिखता हूं जो एक 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_, मुझे यह समस्या नहीं हुई।
क्योंकि अजगर एक गतिशील भाषा है, यह आमतौर पर एक चर और एक ही नाम देने के लिए एक अच्छा विचार नहीं है। id () python में एक फंक्शन है, इसलिए यह सलाह दी जाती है कि id नामक वैरिएबल का उपयोग न करें। ध्यान में रखते हुए, यह उन सभी कार्यों पर लागू होता है जो आप उपयोग कर सकते हैं ... एक चर में फ़ंक्शन के समान नाम नहीं होना चाहिए।