'আইডি' পাইথনের একটি খারাপ পরিবর্তনশীল নাম


141

idপাইথনে ভেরিয়েবলের নাম রাখা কেন খারাপ ?


33
বেশিরভাগ লোক শনাক্তকারীদের আন্ডারস্কোর যুক্ত করে যা বিল্টিনস / কীওয়ার্ডগুলির সাথে সংঘর্ষে থাকে: আইডি_, মানচিত্র_, তালিকা_, ফিল্টার_, ইত্যাদি
সিডলারি

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
পছন্দ করেছেন নামটি কী খারাপ! একটি সাধারণ, সাধারণ নাম যা কয়েক হাজার জায়গায় ব্যবহৃত হয় (যেখানে প্রসঙ্গটি অর্থ দেয়)। সুতরাং কেউ সিদ্ধান্ত নিয়েছে যে এটি কোনও বিশ্বব্যাপী নাম হিসাবে ব্যবহার করা হবে যেখানে কোনও প্রসঙ্গ নেই?
বেসিক

2
আশ্চর্যরূপে, গুগলের নিজস্ব পাইথন রেজেক্স টিউটোরিয়াল ( বিকাশকারীরা / ডেডু / স্পাইথন / রেগুলার- এক্সপ্রেশন ) ব্যবহার করে str = 'an example word:cat!!'। এমন কোনও পিইপি-তে আছে যা বলে যে এটি করবেন না?
શબ્દরাঘে

57

ইন PEP 8 - পাইথন কোড স্টাইল গাইড , এ বিভাগে নিম্নলিখিত নির্দেশিকা প্রদর্শিত হয় বর্ণনামূলক: নামকরণ শৈলী :

  • single_trailing_underscore_ : পাইথন কীওয়ার্ডের সাথে দ্বন্দ্ব এড়াতে কনভেনশন দ্বারা ব্যবহৃত হয়, যেমন

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

সুতরাং, প্রশ্নের উত্তর দেওয়ার জন্য, এই নির্দেশিকাটি প্রয়োগ করে এমন একটি উদাহরণ হ'ল:

id_ = 42

চলক নামে আন্ডারস্কোর অনুসরণ করে অভিপ্রায়টি পরিষ্কার করা হয় (পিইপি 8-র দিকনির্দেশের সাথে পরিচিতদের কাছে)।


1
প্রকৃত প্রশ্নের উত্তর না, কিন্তু PEP-8 নামকরণ কনভেনশন জন্য +1
Ege

ভাল পরামর্শ, তবে idএকটি বিল্টইন, কোনও কীওয়ার্ড নয় এবং এটি কোনও বিল্টিনকে ছায়া দেওয়া কেন খারাপ তা ব্যাখ্যা করে না।
wjandrea

51

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='')

লোভনীয় নাম সহ কিছু বিল্ট-ইনস:

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

8
পিইপি 8 , যা 01-অগস্ট -2013 আপডেট হয়েছিল, এখন কেবল _পরিবর্তনশীল নামের সাথে যুক্ত করে সম্ভাব্য বিভ্রান্তি এড়াতে পরামর্শ দেয় । আমার উত্তর দেখুন দয়া করে ।
ডেভিডআরআর

1
এটি লক্ষণীয় যে idকোনও বস্তুর মেমরি ঠিকানা ফেরত ফাংশনটি সিপিথন বাস্তবায়ন বিশদ। এটি লক্ষণীয় যে ফাংশনটি কেবলমাত্র কোনও দুটি বিদ্যমান বস্তুর জন্য একটি পৃথক সংখ্যা ফেরত দিতে প্রয়োজন । যদি কোনও বস্তু আবর্জনা সংগ্রহ করা হয়, তবে তার আইডি পুনর্ব্যবহারযোগ্য হতে পারে।
জ্যাক সমালোচনা

@ জ্যাক ধন্যবাদ! আমি উত্তরটি সম্পাদনা করে মেমরির ঠিকানা এবং সেই লিঙ্কটি যুক্ত করলাম যাতে লোকেরা আরও পড়তে পারে।
wjandrea

42

আমি এখানে অপ্রিয় কিছু বলতে পারি: id()এটি একটি বিশেষায়িত অন্তর্নির্মিত ফাংশন যা ব্যবসায়িক যুক্তিতে খুব কমই ব্যবহৃত হয়। অতএব আমি কোনও আঁটসাঁট এবং ভাল-লিখিত ফাংশনে পরিবর্তনশীল নাম হিসাবে এটি ব্যবহার করতে কোনও সমস্যা দেখছি না, যেখানে এটি স্পষ্ট যে আইডিটি অন্তর্নির্মিত ফাংশনটি বোঝায় না।


1
এর জবাবে:> আইডি হ'ল একটি বিশেষায়িত বিল্ট-ইন> ফাংশন যা> ব্যবসায়িক যুক্তিতে খুব কমই ব্যবহৃত হয়। অতএব আমি কোনও টাইট এবং সুচিন্তিত> ফাংশনে ভেরিয়েবল> নাম হিসাবে এটি ব্যবহার করতে সমস্যা দেখছি না, কেননা এটি পরিষ্কার হয়ে গেছে যে আইডি> অন্তর্নির্মিত ফাংশনটি বোঝায় না। যদিও এটি সত্য, কেবল "আইডি" এর চেয়ে এই পরিবর্তনশীল নামের সাথে আরও সুনির্দিষ্ট হওয়া সম্ভবত একটি ভাল ধারণা। প্রচুর জিনিসের আইডি রয়েছে (বিশেষত যদি আপনি আরডিবিএমএস নিয়ে কাজ করছেন), এবং টিম পিটার্সের দ্য জেন অফ পাইথনের দ্বিতীয় লাইনটি আমাদের বলে:> স্পষ্ট বর্ণের চেয়ে আরও ভাল licit দৌড়ে import this
রস

9
আমি যদি এখনও সম্ভব হয় তা এড়াতে চাই। এমনকি সহকর্মীদের অভিযোগ না শুনে অন্য কোনও কারণ না থাকলেও। :-)
জেসন বেকার 16

1
আমি সম্পূর্ণরূপে সম্মত: একটি ছোট ফাংশনে একটি ভেরিয়েবল "আইডি" নামকরণ (এবং এইভাবে সুযোগ) নিরীহ is খুব কম লোকই idযাইহোক বিল্টিন ব্যবহার করে । এটি বলেছিল যে যখন কোনও সহকর্মী listস্থানীয় ভেরিয়েবল সহ বিল্টিনকে ওভাররড করে তখন আমার কিছুটা সময় লেগেছিল । সুতরাং অন্যান্য সাধারণ ব্যক্তিরা যে সাধারণ নিয়মটি উল্লেখ করেছেন তা এখনও বোধগম্য।
সিলভিট

5

বিল্ট ইন ফাংশন পরে কোনও ভেরিয়েবলের নাম দেওয়া খারাপ। এর অন্যতম কারণ হ'ল পাঠকের কাছে এটি বিভ্রান্তিকর হতে পারে যা জানেন না যে নামটি ওভাররাইড করা হয়েছে।


2

idপাইথনের একটি অন্তর্নির্মিত ফাংশন। একটি মান নির্ধারণ করা idক্রিয়াকে ওভাররাইড করবে। হয় হিসাবে একটি উপসর্গ যুক্ত করা some_idবা হিসাবে হিসাবে একটি ভিন্ন মূলধন এটি ব্যবহার ভাল ID

বিল্ট ইন ফাংশনটি একটি একক আর্গুমেন্ট গ্রহণ করে এবং আপনি যে বস্তুটি পাস করেছিলেন তার মেমরি ঠিকানার (পূর্ণ সংখ্যায় সিপিথন) প্রদান করে returns

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

2
নোট করুন যে আপনি কোনও শ্রেণীর বৈশিষ্ট্য বা পদ্ধতিটির নাম 'আইডি' রাখতে পারেন, এটি বিল্ট ইন ফাংশনটিকে স্পর্শ করবে না।
টনি রুনা

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

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


3
"যেহেতু পাইথন একটি গতিশীল ভাষা, সাধারণত একটি ভেরিয়েবল এবং ফাংশনটিকে একই নাম দেওয়া ভাল ধারণা নয়।" - আপনি কোনও ভেরিয়েবল এবং কোনও ফাংশন একই নাম দিতে পারবেন না। এটি একটি গতিশীল ভাষা হওয়ার সাথে কিছুই করার নয়। আপনি যদি বোঝাতে চান সম্পত্তি হিসাবে একই ক্ষেত্রের অন্যান্য বস্তুর মতো একই নাম দেওয়া, আমিও এতে একমত নই। আপনার কাছে "কী" নামে একটি শ্রেণি থাকতে পারে, সেই শ্রেণীর একটি উদাহরণ "কী" নামে পরিচিত এবং "কী" নামে পরিচিত অন্য কোনও সামগ্রীর সম্পত্তি, যেমন, "ডোর.কি"।
পূরেল
আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.