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!!'। এমন কোনও পিইপি-তে আছে যা বলে যে এটি করবেন না?
ইন PEP 8 - পাইথন কোড স্টাইল গাইড , এ বিভাগে নিম্নলিখিত নির্দেশিকা প্রদর্শিত হয় বর্ণনামূলক: নামকরণ শৈলী :
single_trailing_underscore_: পাইথন কীওয়ার্ডের সাথে দ্বন্দ্ব এড়াতে কনভেনশন দ্বারা ব্যবহৃত হয়, যেমন
Tkinter.Toplevel(master, class_='ClassName')
সুতরাং, প্রশ্নের উত্তর দেওয়ার জন্য, এই নির্দেশিকাটি প্রয়োগ করে এমন একটি উদাহরণ হ'ল:
id_ = 42
চলক নামে আন্ডারস্কোর অনুসরণ করে অভিপ্রায়টি পরিষ্কার করা হয় (পিইপি 8-র দিকনির্দেশের সাথে পরিচিতদের কাছে)।
idএকটি বিল্টইন, কোনও কীওয়ার্ড নয় এবং এটি কোনও বিল্টিনকে ছায়া দেওয়া কেন খারাপ তা ব্যাখ্যা করে না।
idহ'ল একটি অন্তর্নির্মিত ফাংশন যা কোনও বস্তুর পরিচয় দেয় (এটি সিপাইটিতে এটির মেমরি ঠিকানা)। আপনি আপনার ফাংশন একটি নাম যদি id, আপনি বলতে হবে builtins.idমূল পেতে (অথবা __builtins__.idCPython মধ্যে)। 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কোনও বস্তুর মেমরি ঠিকানা ফেরত ফাংশনটি সিপিথন বাস্তবায়ন বিশদ। এটি লক্ষণীয় যে ফাংশনটি কেবলমাত্র কোনও দুটি বিদ্যমান বস্তুর জন্য একটি পৃথক সংখ্যা ফেরত দিতে প্রয়োজন । যদি কোনও বস্তু আবর্জনা সংগ্রহ করা হয়, তবে তার আইডি পুনর্ব্যবহারযোগ্য হতে পারে।
আমি এখানে অপ্রিয় কিছু বলতে পারি: id()এটি একটি বিশেষায়িত অন্তর্নির্মিত ফাংশন যা ব্যবসায়িক যুক্তিতে খুব কমই ব্যবহৃত হয়। অতএব আমি কোনও আঁটসাঁট এবং ভাল-লিখিত ফাংশনে পরিবর্তনশীল নাম হিসাবে এটি ব্যবহার করতে কোনও সমস্যা দেখছি না, যেখানে এটি স্পষ্ট যে আইডিটি অন্তর্নির্মিত ফাংশনটি বোঝায় না।
import this
idযাইহোক বিল্টিন ব্যবহার করে । এটি বলেছিল যে যখন কোনও সহকর্মী listস্থানীয় ভেরিয়েবল সহ বিল্টিনকে ওভাররড করে তখন আমার কিছুটা সময় লেগেছিল । সুতরাং অন্যান্য সাধারণ ব্যক্তিরা যে সাধারণ নিয়মটি উল্লেখ করেছেন তা এখনও বোধগম্য।
idপাইথনের একটি অন্তর্নির্মিত ফাংশন। একটি মান নির্ধারণ করা idক্রিয়াকে ওভাররাইড করবে। হয় হিসাবে একটি উপসর্গ যুক্ত করা some_idবা হিসাবে হিসাবে একটি ভিন্ন মূলধন এটি ব্যবহার ভাল ID।
বিল্ট ইন ফাংশনটি একটি একক আর্গুমেন্ট গ্রহণ করে এবং আপনি যে বস্তুটি পাস করেছিলেন তার মেমরি ঠিকানার (পূর্ণ সংখ্যায় সিপিথন) প্রদান করে returns
>>> 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_, আমার এই সমস্যাটি হবে না।
যেহেতু অজগর একটি গতিশীল ভাষা, সাধারণত একটি ভেরিয়েবল এবং ফাংশনটিকে একই নাম দেওয়া ভাল ধারণা নয় not আইডি () অজগর একটি ফাংশন, তাই এটি পরিবর্তনশীল নামের আইডি ব্যবহার না করার পরামর্শ দেয়। এটি মনে রেখে, এটি আপনার ব্যবহার করতে পারে এমন সমস্ত ফাংশনের ক্ষেত্রে প্রযোজ্য ... কোনও ভেরিয়েবলের কোনও ফাংশনের মতো একই নাম থাকা উচিত নয়।