যেখানে আমি জিজ্ঞাসিত প্রশ্নের উত্তর দিয়েছি Answer
পাইথন এটি কেন বাক্সের বাইরে রাখে না?
আমি সন্দেহ করি যে পাইথনের জেনের সাথে এটির সম্পর্ক আছে : "এটির জন্য সুস্পষ্ট উপায় -" একটি অবশ্যই হওয়া উচিত। এটি অভিধান থেকে মানগুলি অ্যাক্সেসের দুটি সুস্পষ্ট উপায় তৈরি করবে: obj['key']
এবংobj.key
।
গুহা এবং পিটফলস
এর মধ্যে কোডের স্পষ্টতা এবং বিভ্রান্তির সম্ভাবনা রয়েছে। উদাহরণস্বরূপ, নীচেরটি অন্য কোনও ব্যক্তিকে বিভ্রান্ত করতে পারে যিনি পরের তারিখে আপনার কোড বজায় রাখতে যাচ্ছেন বা এমনকি যদি আপনি কিছুক্ষণের জন্য এতে ফিরে না যান তবে আপনার কাছেও তা বিভ্রান্তিকর হতে পারে । আবার, জেন থেকে : "পঠনযোগ্যতা গণনা!"
>>> KEY = 'spam'
>>> d[KEY] = 1
>>> # Several lines of miscellaneous code here...
... assert d.spam == 1
যদি d
তা তাত্ক্ষণিকভাবে থাকে বা KEY
সংজ্ঞায়িত হয় বা d[KEY]
যেখানে d.spam
ব্যবহৃত হচ্ছে সেখান থেকে অনেক দূরে নির্ধারিত হয় তবে এটি সহজেই কী হচ্ছে তা নিয়ে বিভ্রান্তির কারণ হতে পারে, কারণ এটি সাধারণভাবে ব্যবহৃত কোনও প্রতিমা নয়। আমি জানি এটি আমাকে বিভ্রান্ত করার সম্ভাবনা থাকবে।
যোগসূত্র হিসাবে, আপনি যদি KEY
নিম্নলিখিতটির মান পরিবর্তন করেন (তবে পরিবর্তনটি মিস করেন d.spam
) তবে আপনি এখন পাবেন:
>>> KEY = 'foo'
>>> d[KEY] = 1
>>> # Several lines of miscellaneous code here...
... assert d.spam == 1
Traceback (most recent call last):
File "<stdin>", line 2, in <module>
AttributeError: 'C' object has no attribute 'spam'
আইএমও, চেষ্টা করার মতো নয়।
অন্যান্য আইটেম
অন্যরা যেমন উল্লেখ করেছে, আপনি কোনও হ্যাশযোগ্য অবজেক্ট (কেবল একটি স্ট্রিং নয়) ডিক কী হিসাবে ব্যবহার করতে পারেন। উদাহরণ স্বরূপ,
>>> d = {(2, 3): True,}
>>> assert d[(2, 3)] is True
>>>
আইনী, কিন্তু
>>> C = type('C', (object,), {(2, 3): True})
>>> d = C()
>>> assert d.(2, 3) is True
File "<stdin>", line 1
d.(2, 3)
^
SyntaxError: invalid syntax
>>> getattr(d, (2, 3))
Traceback (most recent call last):
File "<stdin>", line 1, in <module>
TypeError: getattr(): attribute name must be string
>>>
এটি না. এটি আপনাকে আপনার অভিধানের কীগুলির জন্য মুদ্রণযোগ্য অক্ষর বা অন্যান্য হ্যাশযোগ্য অবজেক্টগুলির পুরো ব্যাপ্তিতে অ্যাক্সেস দেয়, যা কোনও বস্তুর বৈশিষ্ট্যে অ্যাক্সেস করার সময় আপনার কাছে নেই। পাইথন কুকবুকের রেসিপিটির মতো এটি ক্যাশেড অবজেক্ট মেটাক্লাসের মতো যাদু সম্ভব করে তোলে (চতুর্থ 9) ।
যার মধ্যে আমি সম্পাদকীয়
আমি spam.eggs
ওভারের নান্দনিকতাকে পছন্দ spam['eggs']
করি (আমার মনে হয় এটি আরও পরিষ্কার দেখাচ্ছে), এবং আমি যখন পূরণ করি তখন সত্যিই আমি এই কার্যকারিতাটি তাকাতে শুরু করি namedtuple
। তবে নিম্নলিখিত ট্রাম্পগুলি করতে সক্ষম হবার সুবিধার্থে এটি umps
>>> KEYS = 'spam eggs ham'
>>> VALS = [1, 2, 3]
>>> d = {k: v for k, v in zip(KEYS.split(' '), VALS)}
>>> assert d == {'spam': 1, 'eggs': 2, 'ham': 3}
>>>
এটি একটি সাধারণ উদাহরণ, তবে আমি প্রায়শই নিজেকে obj.key
স্বরলিপি ব্যবহার করার চেয়ে বিভিন্ন পরিস্থিতিতে ডিক্টস ব্যবহার করে দেখতে পাই (যেমন, যখন আমি এক্সএমএল ফাইল থেকে প্রিফেস পড়তে হবে)। অন্যান্য ক্ষেত্রে, যেখানে আমি একটি গতিশীল শ্রেণিকে তাত্ক্ষণিকভাবে প্রলুব্ধ করতে এবং নান্দনিক কারণে এটিতে কিছু গুণাবলী চাপিয়ে দিতে প্ররোচিত করছি, আমি পঠনযোগ্যতা বাড়াতে ধারাবাহিকতার জন্য ডিক ব্যবহার করা চালিয়ে যাচ্ছি।
আমি নিশ্চিত যে ওপি দীর্ঘকাল থেকেই তার সন্তুষ্টির জন্য এটি সমাধান করেছে, তবে যদি তিনি এখনও এই কার্যকারিতাটি চান তবে আমি পরামর্শ দিচ্ছি যে সে পাইপি থেকে প্যাকেজগুলির মধ্যে একটি ডাউনলোড করবে যা এটি সরবরাহ করে:
গুচ্ছ যার সাথে আমি বেশি পরিচিত। সাবক্লাসdict
, যাতে আপনার সমস্ত কার্যকারিতা থাকে।
এট্রিক্টিক্টও দেখতে দেখতে এটি বেশ সুন্দর বলে মনে হচ্ছে তবে আমি এর সাথে তেমন পরিচিত নই এবং আমার কাছে গুচ্ছের মতো উত্স থেকে উত্সক্ষেত্রটি সন্ধান করিনি।
- আসক্তি সক্রিয়ভাবে রক্ষণাবেক্ষণ করা হয় এবং অ্যাটর্কের মতো অ্যাক্সেস এবং আরও অনেক কিছু সরবরাহ করে।
- রোটারেটির মন্তব্যে যেমন উল্লেখ করা হয়েছে, গুচ্ছকে অবমূল্যায়ন করা হয়েছে, তবে মঞ্চ নামে একটি সক্রিয় কাঁটাচামচ রয়েছে ।
তবে, তাঁর কোডটির পাঠযোগ্যতা উন্নত করার জন্য আমি দৃ strongly়ভাবে সুপারিশ করছি যে তিনি তাঁর স্বরলিখনের শৈলীগুলি না মেশান। যদি তিনি এই স্বরলিপিটি পছন্দ করেন তবে তার উচিত কেবল একটি গতিশীল অবজেক্টটি ইনস্ট্যান্ট করা উচিত, এতে তার পছন্দসই বৈশিষ্ট্য যুক্ত করা উচিত এবং এটিকে একটি দিন বলা উচিত:
>>> C = type('C', (object,), {})
>>> d = C()
>>> d.spam = 1
>>> d.eggs = 2
>>> d.ham = 3
>>> assert d.__dict__ == {'spam': 1, 'eggs': 2, 'ham': 3}
আমি আপডেট করেছি, মন্তব্যগুলিতে একটি ফলো-আপ প্রশ্নের উত্তর দিতে
মন্তব্যে (নীচে), এলমো জিজ্ঞাসা করেছেন:
আপনি যদি আরও গভীরে যেতে চান? (টাইপ (...) উল্লেখ করে)
যদিও আমি এই ব্যবহারের কেসটি কখনও ব্যবহার করি নি (আবারও, আমি dict
ধারাবাহিকতার জন্য নেস্টেড ব্যবহার করি ), নিম্নলিখিত কোডটি কাজ করে:
>>> C = type('C', (object,), {})
>>> d = C()
>>> for x in 'spam eggs ham'.split():
... setattr(d, x, C())
... i = 1
... for y in 'one two three'.split():
... setattr(getattr(d, x), y, i)
... i += 1
...
>>> assert d.spam.__dict__ == {'one': 1, 'two': 2, 'three': 3}
collections.namedtuple
এই জন্য খুব দরকারী।