অ্যাট্রিবিটের মতো ডিক কীগুলি অ্যাক্সেস করছেন?


303

আমি obj.fooপরিবর্তে ডিক কীগুলি অ্যাক্সেস করা আরও সুবিধাজনক বলে মনে obj['foo']করি, তাই আমি এই স্নিপেটটি লিখেছিলাম:

class AttributeDict(dict):
    def __getattr__(self, attr):
        return self[attr]
    def __setattr__(self, attr, value):
        self[attr] = value

যাইহোক, আমি ধরে নিই যে পাইথন বাক্সের বাইরে এই কার্যকারিতাটি সরবরাহ করে না এমন কিছু কারণ অবশ্যই আছে। এইভাবে ডিক কীগুলি অ্যাক্সেস করার সতর্কতা এবং সমস্যাগুলি কী হবে?


16
আপনি যদি স্থির আকারের সীমিত সেট থেকে হার্ডকোডযুক্ত কীগুলি যে কোনও জায়গায় অ্যাক্সেস করছেন তবে এগুলি ধারণ করে এমন বস্তু তৈরি করা আপনার পক্ষে ভাল। collections.namedtupleএই জন্য খুব দরকারী।

6
stackoverflow.com/questions/3031219/… এর অনুরূপ সমাধান রয়েছে তবে আরও একটি ধাপ এগিয়ে যায়
কেফলাভিচ

1
Github.com/bcj/AttrDict এ এর জন্য একটি মডিউল পেয়েছি । আমি জানি না কীভাবে এটি সমাধান এবং এখানে সম্পর্কিত প্রশ্নগুলির সাথে তুলনা করে।
ম্যাট উইলকি

আমি অনুরূপ হ্যাকগুলিও ব্যবহার করেছি, এখন আমি ব্যবহার করিeasydict.EasyDict
মিউন

একটি দিয়ে 'অভিধান সদস্যদের অ্যাক্সেসের আরও উপায়।' : stackoverflow.com/questions/2352181/…
প্যালে ব্লু ডট

উত্তর:


304

এটি করার সর্বোত্তম উপায় হ'ল:

class AttrDict(dict):
    def __init__(self, *args, **kwargs):
        super(AttrDict, self).__init__(*args, **kwargs)
        self.__dict__ = self

কিছু উপকার:

  • এটি আসলে কাজ করে!
  • কোনও অভিধান শ্রেণীর পদ্ধতি ছায়া গোছানো হয়নি (উদাহরণস্বরূপ .keys()ঠিক কাজ করুন Un অবশ্যই - আপনি তাদের কিছু মূল্য নির্ধারণ করেন, নীচে দেখুন)
  • বৈশিষ্ট্য এবং আইটেমগুলি সবসময় সিঙ্ক থাকে
  • অ্যাট্রিবিউট কীটি অ্যাট্রিবিউট হিসাবে অ্যাক্সেস করার চেষ্টা করা এর AttributeErrorপরিবর্তে সঠিকভাবে উত্থাপন করেKeyError

কনস:

  • আগত ডেটার মাধ্যমে ওভাররাইট করা হলে এর মতো পদ্ধতিগুলি ঠিক কাজ .keys()করবে না
  • একটি স্মৃতি ফাঁসির কারণপাইথন <2.7.4 / পাইথন 3 <3.2.3 এ হওয়ার
  • Pylint সঙ্গে কলা যায় E1123(unexpected-keyword-arg)এবংE1103(maybe-no-member)
  • অবিচ্ছিন্নতার জন্য এটি খাঁটি যাদু বলে মনে হচ্ছে।

এটি কীভাবে কাজ করে তার একটি সংক্ষিপ্ত ব্যাখ্যা

  • সমস্ত অজগর বস্তু অন্তর্গতভাবে তাদের নামগুলি একটি অভিধানে তাদের বৈশিষ্ট্যগুলি সংরক্ষণ করে __dict__
  • অভ্যন্তরীণ __dict__অভিধানটি "কেবল একটি সরল ডিক" হওয়া দরকার বলে কোনও প্রয়োজন নেই , তাই আমরা dict()অভ্যন্তরীণ অভিধানে যে কোনও সাবক্লাস নির্ধারণ করতে পারি ।
  • আমাদের ক্ষেত্রে আমরা কেবল AttrDict()তাত্ক্ষণিকভাবে উদাহরণটি নির্ধারণ করি (যেমন আমরা আছি __init__)।
  • super()এর __init__()পদ্ধতিটি কল করে আমরা নিশ্চিত করেছিলাম যে এটি (ইতিমধ্যে) অভিধানের মতো হুবহু আচরণ করে, যেহেতু ফাংশনটি সমস্ত অভিধান তাত্পর্য কোডকে কল করে ।

পাইথন বাক্সের বাইরে এই কার্যকারিতাটি সরবরাহ করে না তার একটি কারণ

"কনস" তালিকায় উল্লিখিত হিসাবে, এটি সঞ্চিত কীগুলির নাম স্থান (যা স্বেচ্ছাসেবী এবং / অথবা অবিশ্বস্ত ডেটা থেকে আসতে পারে!) বিল্টিন ডিক্ট পদ্ধতি বৈশিষ্ট্যের নামের সাথে সংযুক্ত করে। উদাহরণ স্বরূপ:

d = AttrDict()
d.update({'items':["jacket", "necktie", "trousers"]})
for k, v in d.items():    # TypeError: 'list' object is not callable
    print "Never reached!"

1
আপনি কি মনে করেন যে স্মৃতি ফাঁস একটি সাধারণ অবজেক্টের সাথে ঘটবে যেমন: >>> ক্লাস মাইডি (অবজেক্ট): ... ডিফ ডিআইও __ (স্ব, ডি): ... স্ব .__ ডিক = ডি
রাফে

এমনকি ২.7
পিআই-তে

1
এটি <= 2.7.3 হিসাবে তৈরি করুন যা আমি ব্যবহার করছি as
পাই

1
২.7.৪ রিলিজ নোটগুলিতে তারা এটিকে স্থির করে উল্লেখ করেছে (আগে নয়)।
রবার্ট সিমার

1
@ বিভিকসিংহগিগিটস কেবলমাত্র আপনি এর মাধ্যমে জিনিসগুলিতে অ্যাক্সেস করছেন বলে আপনি ভাষাটির .নিয়মগুলি ভঙ্গ করতে পারবেন না :) এবং আমি AttrDictস্বয়ংক্রিয়ভাবে স্থান-সম্বলিত ক্ষেত্রগুলিকে অন্যরকম কিছুতে রূপান্তর করতে চাই না ।
ইয়ুরিক

125

আপনি যদি অ্যারে স্বরলিপি ব্যবহার করেন তবে কীটির অংশ হিসাবে আপনার সমস্ত আইনী স্ট্রিং অক্ষর থাকতে পারে। উদাহরণ স্বরূপ,obj['!#$%^&*()_']


1
@ ইজকাটা হ্যাঁ এসই সম্পর্কে মজার বিষয় যে সাধারণত একটি 'শীর্ষ প্রশ্ন' থাকে। শিরোনাম এবং একটি 'নীচের প্রশ্ন', সম্ভবত এসই শুনতে পছন্দ করেন না কারণ "শিরোনাম সব বলে"; 'সাবধান' এখানে নীচে এক।
n611x007

2
জাভাস্ক্রিপ্ট প্রোগ্রামিং ভাষার বিশেষত একটি ভাল উদাহরণ নয়, তবে জেএসের বস্তুগুলি অ্যাট্রিবিউট অ্যাক্সেস এবং অ্যারে স্বীকৃতি উভয়কেই সমর্থন করে, যা সাধারণ ক্ষেত্রে ক্ষেত্রে সুবিধার্থে এবং প্রতীকগুলির জন্য জেনেরিক ফ্যালব্যাককে সমর্থন করে যা আইনী বৈশিষ্ট্যের নাম নয়।
আন্দ্রে ক্যারন

@ ইজকাটা কীভাবে এই প্রশ্নের উত্তর দেয়। এই উত্তরটি কেবল বলেছেন যে কীগুলির কোনও নাম থাকতে পারে।
মেলাব

4
@ মেলাব প্রশ্নটি What would be the caveats and pitfalls of accessing dict keys in this manner?(বৈশিষ্ট্য হিসাবে), এবং উত্তরটি হ'ল এখানে প্রদর্শিত বেশিরভাগ অক্ষর ব্যবহারযোগ্য হবে না।
ইজকাটা

83

এই অন্যান্য প্রশ্ন থেকে একটি দুর্দান্ত বাস্তবায়ন উদাহরণ রয়েছে যা আপনার বিদ্যমান কোডটিকে সহজতর করে। কেমন:

class AttributeDict(dict): 
    __getattr__ = dict.__getitem__
    __setattr__ = dict.__setitem__

আরও বেশি সংক্ষিপ্ত এবং ভবিষ্যতে আপনার __getattr__এবং __setattr__ফাংশনগুলিতে অতিরিক্ত ক্রাফ্ট প্রবেশের কোনও স্থান ছাড়বে না ।


আপনি এই পদ্ধতিটি ব্যবহার করে AttributeDict.update বা AttributeDict.get কল করতে সক্ষম হবেন?
ডোর

13
আপনাকে মনে রাখতে হবে যে আপনি রানটাইমে নতুন বৈশিষ্ট্য যুক্ত করলে সেগুলি ডিকের সাথেই যুক্ত হয় না তবে ডিক বৈশিষ্ট্যে যুক্ত হয় ute যেমন d = AttributeDict(foo=1)d.bar = 1বার অ্যাট্রিবিউটটি ডিক অ্যাট্রিবিউটের ভিতরে সংরক্ষণ করা হয় তবে ডিকের মধ্যে নয়। মুদ্রণ dশুধুমাত্র foo আইটেম দেখায়।
P3trus

7
+1 কারণ যতদূর আমি বলতে পারি এটি নিখুঁতভাবে কাজ করে। @ গ্রেঙ্গোসুয়াভ, @ ইজকাটা, @ পি 3 ট্রাস আমি যে কাউকে দাবি করে ব্যর্থ হয়েছে যে এটি ব্যর্থ হয়েছে এমন উদাহরণটি দেখায় যা কাজ করে না d = AttributeDict(foo=1);d.bar = 1;print d=> {'foo': 1, 'bar': 1}আমার পক্ষে কাজ করে!
ডেভ আব্রাহামস

4
@ ডেভ আব্রাহামস সম্পূর্ণ প্রশ্নটি পড়ুন এবং হ্যারি, রায়ান এবং দ্যকমুনিস্টডকের উত্তরগুলি দেখুন। এটি কীভাবে করবেন তা জিজ্ঞাসা করছে না , তবে দেখা দিতে পারে এমন সমস্যা সম্পর্কে ।
ইজকাটা

6
আপনি একটি প্রদান করা উচিত __getattr__পদ্ধতি একটি উত্থাপন যে AttributeErrorযদি দেওয়া অ্যাট্রিবিউট বিদ্যমান নয়, অন্যথায় জিনিষ পছন্দ getattr(obj, attr, default_value)কাজ নয় (অর্থাত ফেরত দেয় না না default_valueযদি attrউপস্থিত না obj)
jcdude

83

যেখানে আমি জিজ্ঞাসিত প্রশ্নের উত্তর দিয়েছি 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}

1
কাঁদি : নিন্দা করা হয়েছে, কিন্তু সেখানে এটি একজন সক্রিয় কাঁটাচামচ হয় github.com/Infinidat/munch
Rotareti

@ রোটারেটি - মাথা উঁচু করার জন্য ধন্যবাদ! এটি আমি যে কার্যকারিতাটি ব্যবহার করি তা নয়, তাই আমি সে সম্পর্কে অসচেতন।
ডগ আর।

আপনি যদি আরও গভীরে যেতে চান? (টাইপ (...) উল্লেখ করে)
ওলে অলড্রিক

6
পাইথন হ'ল ভারী বৃষ্টিতে উচ্চতর উল্টানো ছাতার মতো। এটি দেখতে স্মার্ট এবং মজাদার মনে হচ্ছে, কিছুক্ষণ পরে এটি ভারী হওয়া শুরু হয়, অতঃপর হঠাৎ আপনি এসই-তে কিছু বিল্ট-ইন গুরু স্টাফ পড়েছিলেন এবং পুরো জিনিসটি আপনার কাঁধের উপর দিয়ে পুরোপুরি ফিরে আসে। এখনও ভেজা অবস্থায় আপনি হালকা বোধ করেন এবং সবকিছু এত পরিষ্কার এবং সতেজ হয়।
ওলে অলড্রিক

21

ক্যাভেট এমপোটার: কিছু কারণে এই জাতীয় ক্লাসগুলি মাল্টিপ্রসেসিং প্যাকেজটি ভেঙে ফেলবে বলে মনে হয়। আমি এই এসও খুঁজে পাওয়ার আগে কিছুক্ষণ এই বাগের সাথে লড়াই করেছি: পাইথন মাল্টিপ্রসেসিংয়ে ব্যতিক্রম সন্ধান করছি


19

আপনি স্ট্যান্ডার্ড লাইব্রেরি থেকে একটি সুবিধাজনক ধারক শ্রেণি টানতে পারেন:

from argparse import Namespace

কোড বিটের চারপাশে অনুলিপি করা এড়াতে। কোনও স্ট্যান্ডার্ড অভিধান অ্যাক্সেস নেই, তবে আপনি যদি সত্যিই এটি চান তবে একটি ফিরে পাওয়া সহজ। আরগপার্সে কোডটি সহজ,

class Namespace(_AttributeHolder):
    """Simple object for storing attributes.

    Implements equality by attribute names and values, and provides a simple
    string representation.
    """

    def __init__(self, **kwargs):
        for name in kwargs:
            setattr(self, name, kwargs[name])

    __hash__ = None

    def __eq__(self, other):
        return vars(self) == vars(other)

    def __ne__(self, other):
        return not (self == other)

    def __contains__(self, key):
        return key in self.__dict__

2
প্লাস 1 একটি স্ট্যান্ডার্ড লাইব্রেরি রেফারেন্সের জন্য, যা ওপির প্রথম মন্তব্যে সম্বোধন করে।
গর্ডন বিন

4
পাইথন সে ক্ষেত্রে একটি দ্রুত শ্রেণি অন্তর্ভুক্ত করেছে (সি তে প্রয়োগ করা হয়েছে): types.SimpleNamespace ডকস.পিথন.আর.দেব
নুনো আন্ড্রে

18

আপনি যদি এমন কী কী চান যা একটি পদ্ধতি ছিল, যেমন __eq__বা__getattr__ ?

এবং আপনি কোনও প্রবেশাধিকার রাখতে সক্ষম হবেন না যা কোনও চিঠি দিয়ে শুরু হয়নি, তাই ব্যবহার করে 0343853 কী হিসাবে শেষ হয়েছে।

এবং আপনি যদি একটি স্ট্রিং ব্যবহার করতে না চান?


প্রকৃতপক্ষে, বা উদাহরণস্বরূপ অন্যান্য বস্তুগুলি কী হিসাবে। তবে আমি এ থেকে ত্রুটিটিকে 'প্রত্যাশিত আচরণ' হিসাবে শ্রেণিবদ্ধ করব - আমার প্রশ্নের সাথে আমি অপ্রত্যাশিত দিকে আরও লক্ষ্য রেখেছিলাম।
ইজ আদ-দিন রুহুলসিন

pickle.dumpব্যবহার__getstate__
সিস টিমারম্যান

12

টিপলস ডিক কী ব্যবহার করা যেতে পারে। আপনি কীভাবে আপনার নির্মাণে টুপল অ্যাক্সেস করবেন?

এছাড়াও, নামডটপল একটি সুবিধাজনক কাঠামো যা বৈশিষ্ট্য অ্যাক্সেসের মাধ্যমে মান সরবরাহ করতে পারে।


7
নেমেডটপলসের অপূর্ণতা হ'ল এগুলি অপরিবর্তনীয়।
ইজ আদ-দিন রুহুলসিন

10
কেউ কেউ বলবেন যে অপরিবর্তনীয় হওয়া কোনও বাগ নয় বরং টিপলসের বৈশিষ্ট্য।
বেন লেখক

9

প্রোডাক্ট সম্পর্কে কীভাবে , এই ছোট্ট পাইথন ক্লাসটি যা আমি লিখেছিলাম সেগুলি সম্পর্কে :)

এছাড়াও, আপনি অটো কোড সমাপ্তি , পুনরাবৃত্ত বস্তুর তাত্পর্য এবং স্বয়ংক্রিয় ধরণের রূপান্তর পান !

আপনি যা চেয়েছিলেন ঠিক তেমন করতে পারেন:

p = Prodict()
p.foo = 1
p.bar = "baz"

উদাহরণ 1: টাইপ ইঙ্গিত

class Country(Prodict):
    name: str
    population: int

turkey = Country()
turkey.name = 'Turkey'
turkey.population = 79814871

অটো কোড সম্পূর্ণ

উদাহরণ 2: অটো টাইপ রূপান্তর

germany = Country(name='Germany', population='82175700', flag_colors=['black', 'red', 'yellow'])

print(germany.population)  # 82175700
print(type(germany.population))  # <class 'int'>

print(germany.flag_colors)  # ['black', 'red', 'yellow']
print(type(germany.flag_colors))  # <class 'list'>

2
পাইপের মাধ্যমে পাইথন 2 এ ইনস্টল করে তবে পাইথন 2 এ কাজ করে না
Ant6n

2
@ এন্ট nn এর টাইপ টীকাগুলির কারণে অজগর 3.6+ প্রয়োজন
রমজান পোলাট

8

এটি সাধারণতায় কাজ করে না। সমস্ত বৈধ ডিক কীগুলি ঠিকানাযোগ্য বৈশিষ্ট্য ("কী") তৈরি করে না। সুতরাং, আপনার যত্নবান হওয়া দরকার।

পাইথন অবজেক্টস সবই মূলত অভিধান। সুতরাং আমি সন্দেহ করি যে এখানে অনেক বেশি পারফরম্যান্স বা অন্যান্য জরিমানা রয়েছে।


8

এটি আসল প্রশ্নের সমাধান করে না, তবে সেই লোকদের পক্ষে কার্যকর হওয়া উচিত যা আমার মত, এই কার্যকারিতাটি সরবরাহ করে এমন কোনও লিবি খুঁজলে এখানেই শেষ হয়।

আসক্তি এটির জন্য এটি একটি দুর্দান্ত bণ: https://github.com/mewwts/addict এটি পূর্ববর্তী উত্তরে উল্লিখিত অনেক উদ্বেগের যত্ন নেয়।

দস্তাবেজের একটি উদাহরণ:

body = {
    'query': {
        'filtered': {
            'query': {
                'match': {'description': 'addictive'}
            },
            'filter': {
                'term': {'created_by': 'Mats'}
            }
        }
    }
}

আসক্তি সহ:

from addict import Dict
body = Dict()
body.query.filtered.query.match.description = 'addictive'
body.query.filtered.filter.term.created_by = 'Mats'

8

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

ভাগ্যক্রমে, বেশ কয়েকটি ওপেন সোর্স প্যাকেজ রয়েছে যা এই কার্যকারিতাটি সরবরাহ করে যা পাইপ ইনস্টল করার জন্য প্রস্তুত! দুর্ভাগ্যক্রমে, বেশ কয়েকটি প্যাকেজ রয়েছে। 2019 এর ডিসেম্বরের মতো এখানে একটি সংক্ষিপ্তসার রয়েছে।

প্রতিযোগীরা (সর্বাধিক সাম্প্রতিক প্রতিশ্রুতিবদ্ধ প্রতিশ্রুতি | # কমিটস | # নিয়ন্ত্রণ | কভারেজ%):

আর রক্ষণাবেক্ষণ বা আন্ডার রক্ষণাবেক্ষণ করা হবে না:

আমি বর্তমানে গুটি বা আসক্তির পরামর্শ দিচ্ছি । তাদের প্রত্যেকের জন্য স্বাস্থ্যকর ওপেন-সোর্স কোডবাসের পরামর্শ দিয়ে সর্বাধিক কমিট, অবদানকারী এবং প্রকাশ রয়েছে release তাদের কাছে পরিচ্ছন্ন দেখাচ্ছে রিডমি.এমডি, ১০০% কভারেজ এবং ভাল দেখতে পরীক্ষার সেট।

আমার নিজের ডিক / অ্যাটর কোডটি রোল করা এবং একটি টন সময় নষ্ট করা ছাড়া এই দৌড়ের (এখনকার জন্য!) কুকুর নেই, কারণ আমি এই সমস্ত অপশন সম্পর্কে অবগত ছিলাম না :)। আমি ভবিষ্যতে নেশা / মামাতে অবদান রাখতে পারি কারণ আমি ভাঙা গুচ্ছগুলির চেয়ে একগুচ্ছ প্যাকেজ দেখতে পাচ্ছি। আপনি যদি তাদের পছন্দ করেন, অবদান! বিশেষত, দেখে মনে হচ্ছে যেন বাজে কোনও কোডেকভ ব্যাজ ব্যবহার করতে পারে এবং নেশাগ্রস্থ ব্যক্তি একটি পাইথন সংস্করণ ব্যাজ ব্যবহার করতে পারে।

আসক্তি পেশাদার:

  • রিকার্সিভ ইনিশিয়ালেশন (foo.abc = 'বার'), ডিকের মতো যুক্তি আসক্তি হয়ে যায় ictডিক্ট

আসক্তি কনস:

  • ছায়া typing.Dictযদি আপনিfrom addict import Dict
  • কী পরীক্ষা করা নেই। রিকার্সিভ থিমকে মঞ্জুরি দেওয়ার কারণে, আপনি যদি কোনও কীটি ভুল বানান থেকে থাকে তবে আপনি কী-ইরর পরিবর্তে একটি নতুন বৈশিষ্ট্য তৈরি করেন (ধন্যবাদ আলজোরস্ট)

গুচ্ছ পেশাদার:

  • অনন্য নামকরণ
  • JSON এবং YAML এর জন্য অন্তর্নির্মিত সার্ / ডি ফাংশন

গুচ্ছ কনস:

  • কোনও পুনরাবৃত্তিমূলক সূচনা / কেবল একবারে একজন অ্যাটরকে আরম্ভ করতে পারে না

যার মধ্যে আমি সম্পাদকীয়

অনেক চাঁদ আগে, যখন আমি পাইথ এডিটরগুলিকে পাইথন লেখার জন্য শুধুমাত্র নিজের বা অন্য কোনও দেবের প্রকল্পগুলিতে ব্যবহার করি তখন আমি ডিক্ট-অ্যাটর্সগুলির স্টাইলটি পছন্দ করেছিলাম, কেবল ঘোষণা দিয়ে কী সন্নিবেশ করানোর ক্ষমতাটি foo.bar.spam = eggs। এখন আমি দলগুলিতে কাজ করি এবং সবকিছুর জন্য একটি আইডিই ব্যবহার করি এবং আমি স্থিতিশীল বিশ্লেষণ, কার্যকরী কৌশল এবং টাইপ ইঙ্গিতের পক্ষে এই জাতীয় ডেটা স্ট্রাকচার এবং গতিশীল টাইপিং থেকে সরে এসেছি। আমি এই কৌশলটি দিয়ে পরীক্ষা শুরু করেছি, নিজের ডিজাইনের বস্তুগুলির সাথে প্রস্ট্রাক্ট সাবক্লাসিং করছি:

class  BasePstruct(dict):
    def __getattr__(self, name):
        if name in self.__slots__:
            return self[name]
        return self.__getattribute__(name)

    def __setattr__(self, key, value):
        if key in self.__slots__:
            self[key] = value
            return
        if key in type(self).__dict__:
            self[key] = value
            return
        raise AttributeError(
            "type object '{}' has no attribute '{}'".format(type(self).__name__, key))


class FooPstruct(BasePstruct):
    __slots__ = ['foo', 'bar']

এটি আপনাকে এমন একটি অবজেক্ট দেয় যা এখনও ডিকের মতো আচরণ করে, তবে আপনাকে আরও কঠোর ফ্যাশনে বৈশিষ্ট্যগুলির মতো কীগুলিতে অ্যাক্সেস করতে দেয়। এখানে সুবিধাটি হ'ল আমি (বা আপনার কোডের অব্যক্ত গ্রাহকরা) ঠিক কী ক্ষেত্রগুলি থাকতে পারে এবং কী থাকতে পারে তা সঠিকভাবে জানে এবং আইডিই ক্ষেত্রগুলি স্বয়ংক্রিয়ভাবে পূরণ করতে পারে। এছাড়াও ভ্যানিলা সাবক্লাসিং dictমানে জসন সিরিয়ালাইজেশন করা সহজ। আমি মনে করি এই ধারণার পরবর্তী বিবর্তনটি হ'ল একটি কাস্টম প্রোটবুফ জেনারেটর যা এই ইন্টারফেসগুলি নির্গত করে এবং জিআরপিসির মাধ্যমে আপনি প্রায় নিখরচায় ক্রস-ল্যাঙ্গুয়েজ ডেটা স্ট্রাকচার এবং আইপিসি পেয়ে যাচ্ছেন তা একটি দুর্দান্ত নক।

আপনি যদি অ্যাটর্িক-ডিক্টস নিয়ে যাওয়ার সিদ্ধান্ত নেন, আপনার নিজের (এবং আপনার সতীর্থের) সন্তুষ্টির জন্য কোন ক্ষেত্রগুলি প্রত্যাশিত তা নথিভুক্ত করা অপরিহার্য।

এই পোস্টটি সাম্প্রতিক রাখার জন্য নির্দ্বিধায় এডিট / আপডেট করুন!


2
এর জন্য একটি বড় কন addictএটি হ'ল আপনি যখন কোনও গুণকে ভুল বানান করবেন তখন এটি ব্যতিক্রম বাড়াবে না কারণ এটি একটি নতুন ফিরিয়ে দেবে Dict(foo.abc = 'বার' কাজ করার জন্য এটি প্রয়োজনীয়)।
আলজোস্ট

5

বিল্ট-ইন ব্যবহার করে অপরিবর্তনীয় রেকর্ডগুলির একটি সংক্ষিপ্ত উদাহরণ এখানে collections.namedtuple:

def record(name, d):
    return namedtuple(name, d.keys())(**d)

এবং ব্যবহারের উদাহরণ:

rec = record('Model', {
    'train_op': train_op,
    'loss': loss,
})

print rec.loss(..)

5

উত্তরে কিছু বৈচিত্র যুক্ত করতে সায়-কিট লার্নিং এটিকে একটি হিসাবে প্রয়োগ করেছে Bunch:

class Bunch(dict):                                                              
    """ Scikit Learn's container object                                         

    Dictionary-like object that exposes its keys as attributes.                 
    >>> b = Bunch(a=1, b=2)                                                     
    >>> b['b']                                                                  
    2                                                                           
    >>> b.b                                                                     
    2                                                                           
    >>> b.c = 6                                                                 
    >>> b['c']                                                                  
    6                                                                           
    """                                                                         

    def __init__(self, **kwargs):                                               
        super(Bunch, self).__init__(kwargs)                                     

    def __setattr__(self, key, value):                                          
        self[key] = value                                                       

    def __dir__(self):                                                          
        return self.keys()                                                      

    def __getattr__(self, key):                                                 
        try:                                                                    
            return self[key]                                                    
        except KeyError:                                                        
            raise AttributeError(key)                                           

    def __setstate__(self, state):                                              
        pass                       

আপনার যা দরকার তা হ'ল পদ্ধতি setattrএবং getattrপদ্ধতিগুলি - getattrডিক কীগুলির জন্য চেকগুলি এবং আসল বৈশিষ্ট্যগুলি পরীক্ষা করার জন্য চালগুলি। setstaetPickling / unpickling "আখা" জন্য ফিক্স জন্য একটি ফিক্স - যদি inerested চেক https://github.com/scikit-learn/scikit-learn/issues/6196


3

ইতিমধ্যে সেটেট্র () এবং গেটআটার () বিদ্যমান হিসাবে নিজের লিখতে হবে না।

শ্রেণীর অবজেক্টগুলির সুবিধা সম্ভবত বর্গ সংজ্ঞা এবং উত্তরাধিকার হিসাবে কার্যকর হয়।


3

আমি এই থ্রেড থেকে ইনপুট উপর ভিত্তি করে এটি তৈরি। যদিও আমার পক্ষে অদ্ভুত ব্যবহার করা দরকার, তাই আমাকে পেতে এবং অ্যাটর সেট করতে হবে। আমি মনে করি এটি বেশিরভাগ বিশেষ ব্যবহারের জন্য কাজ করা উচিত।

ব্যবহার এর মতো দেখাচ্ছে:

# Create an ordered dict normally...
>>> od = OrderedAttrDict()
>>> od["a"] = 1
>>> od["b"] = 2
>>> od
OrderedAttrDict([('a', 1), ('b', 2)])

# Get and set data using attribute access...
>>> od.a
1
>>> od.b = 20
>>> od
OrderedAttrDict([('a', 1), ('b', 20)])

# Setting a NEW attribute only creates it on the instance, not the dict...
>>> od.c = 8
>>> od
OrderedAttrDict([('a', 1), ('b', 20)])
>>> od.c
8

শ্রেণী:

class OrderedAttrDict(odict.OrderedDict):
    """
    Constructs an odict.OrderedDict with attribute access to data.

    Setting a NEW attribute only creates it on the instance, not the dict.
    Setting an attribute that is a key in the data will set the dict data but 
    will not create a new instance attribute
    """
    def __getattr__(self, attr):
        """
        Try to get the data. If attr is not a key, fall-back and get the attr
        """
        if self.has_key(attr):
            return super(OrderedAttrDict, self).__getitem__(attr)
        else:
            return super(OrderedAttrDict, self).__getattr__(attr)


    def __setattr__(self, attr, value):
        """
        Try to set the data. If attr is not a key, fall-back and set the attr
        """
        if self.has_key(attr):
            super(OrderedAttrDict, self).__setitem__(attr, value)
        else:
            super(OrderedAttrDict, self).__setattr__(attr, value)

এটি থ্রেডে ইতিমধ্যে উল্লিখিত একটি দুর্দান্ত শীতল ধাঁচ, তবে আপনি যদি কেবল ডিক নিতে চান এবং কোনও আইডিইতে স্বয়ংক্রিয়-সম্পূর্ণরূপে কাজ করে এমন কোনও বস্তুতে রূপান্তর করতে চান তবে:

class ObjectFromDict(object):
    def __init__(self, d):
        self.__dict__ = d

3

স্পষ্টতই এখন এর জন্য একটি লাইব্রেরি রয়েছে - https://pypi.python.org/pypi/attrdict - যা এই সঠিক কার্যকারিতা প্লাস পুনরাবৃত্ত মার্জ এবং জেসন লোডিং প্রয়োগ করে। এক নজর মূল্যবান হতে পারে।


3

এটিই আমি ব্যবহার করি

args = {
        'batch_size': 32,
        'workers': 4,
        'train_dir': 'train',
        'val_dir': 'val',
        'lr': 1e-3,
        'momentum': 0.9,
        'weight_decay': 1e-4
    }
args = namedtuple('Args', ' '.join(list(args.keys())))(**args)

print (args.lr)

এটি একটি ভাল দ্রুত এবং নোংরা উত্তর। আমার একমাত্র পর্যবেক্ষণ / মন্তব্যটি হ'ল আমি মনে করি যে নামধারী নির্মাতারা স্ট্রিংগুলির একটি তালিকা গ্রহণ করবে, সুতরাং আপনার সমাধানটি সহজ করা যেতে পারে (আমি মনে করি):namedtuple('Args', list(args.keys()))(**args)
ড্যান এনগুইন

2

আমি সবে তৈরি এই ক্লাসটি ব্যবহার করে আপনি এটি করতে পারেন। এই শ্রেণীর সাহায্যে আপনি Mapঅন্য অভিধানের মতো বস্তুটি ব্যবহার করতে পারেন (জসন সিরিয়ালাইজেশন সহ) বা ডট নোটেশন সহ। আমি আপনাকে সাহায্য আশা করি:

class Map(dict):
    """
    Example:
    m = Map({'first_name': 'Eduardo'}, last_name='Pool', age=24, sports=['Soccer'])
    """
    def __init__(self, *args, **kwargs):
        super(Map, self).__init__(*args, **kwargs)
        for arg in args:
            if isinstance(arg, dict):
                for k, v in arg.iteritems():
                    self[k] = v

        if kwargs:
            for k, v in kwargs.iteritems():
                self[k] = v

    def __getattr__(self, attr):
        return self.get(attr)

    def __setattr__(self, key, value):
        self.__setitem__(key, value)

    def __setitem__(self, key, value):
        super(Map, self).__setitem__(key, value)
        self.__dict__.update({key: value})

    def __delattr__(self, item):
        self.__delitem__(item)

    def __delitem__(self, key):
        super(Map, self).__delitem__(key)
        del self.__dict__[key]

ব্যবহারের উদাহরণ:

m = Map({'first_name': 'Eduardo'}, last_name='Pool', age=24, sports=['Soccer'])
# Add new key
m.new_key = 'Hello world!'
print m.new_key
print m['new_key']
# Update values
m.new_key = 'Yay!'
# Or
m['new_key'] = 'Yay!'
# Delete key
del m.new_key
# Or
del m['new_key']

1
মনে রাখবেন যে ছায়া করতে dictপদ্ধতি, যেমন: m=Map(); m["keys"] = 42; m.keys()দেয় TypeError: 'int' object is not callable
bfontaine

@bfontaine ধারণাটি এক ধরণের field/attributeএবং একটি নয় method, তবে আপনি যদি এর পরিবর্তে কোনও সংখ্যা নির্ধারণ করেন তবে আপনি সেই পদ্ধতিটি অ্যাক্সেস করতে পারবেন m.method()
এপুল

2

আমার আর একটি বাস্তবায়ন পোস্ট করুন, যা কিনভাইসের জবাবকে ভিত্তি করে তৈরি করে, তবে http://databio.org/posts/python_AttributeDict.html এ প্রস্তাবিত অ্যাট্রিবিউটডিক্ট থেকে ধারণাগুলি একত্রিত করে ।

এই সংস্করণটির সুবিধা হ'ল এটি নেস্টেড অভিধানগুলির জন্যও কাজ করে:

class AttrDict(dict):
    """
    A class to convert a nested Dictionary into an object with key-values
    that are accessible using attribute notation (AttrDict.attribute) instead of
    key notation (Dict["key"]). This class recursively sets Dicts to objects,
    allowing you to recurse down nested dicts (like: AttrDict.attr.attr)
    """

    # Inspired by:
    # http://stackoverflow.com/a/14620633/1551810
    # http://databio.org/posts/python_AttributeDict.html

    def __init__(self, iterable, **kwargs):
        super(AttrDict, self).__init__(iterable, **kwargs)
        for key, value in iterable.items():
            if isinstance(value, dict):
                self.__dict__[key] = AttrDict(value)
            else:
                self.__dict__[key] = value

1
class AttrDict(dict):

     def __init__(self):
           self.__dict__ = self

if __name__ == '____main__':

     d = AttrDict()
     d['ray'] = 'hope'
     d.sun = 'shine'  >>> Now we can use this . notation
     print d['ray']
     print d.sun

1

সমাধানটি হ'ল:

DICT_RESERVED_KEYS = vars(dict).keys()


class SmartDict(dict):
    """
    A Dict which is accessible via attribute dot notation
    """
    def __init__(self, *args, **kwargs):
        """
        :param args: multiple dicts ({}, {}, ..)
        :param kwargs: arbitrary keys='value'

        If ``keyerror=False`` is passed then not found attributes will
        always return None.
        """
        super(SmartDict, self).__init__()
        self['__keyerror'] = kwargs.pop('keyerror', True)
        [self.update(arg) for arg in args if isinstance(arg, dict)]
        self.update(kwargs)

    def __getattr__(self, attr):
        if attr not in DICT_RESERVED_KEYS:
            if self['__keyerror']:
                return self[attr]
            else:
                return self.get(attr)
        return getattr(self, attr)

    def __setattr__(self, key, value):
        if key in DICT_RESERVED_KEYS:
            raise AttributeError("You cannot set a reserved name as attribute")
        self.__setitem__(key, value)

    def __copy__(self):
        return self.__class__(self)

    def copy(self):
        return self.__copy__()

1

এইভাবে ডিক কীগুলি অ্যাক্সেস করার সতর্কতা এবং সমস্যাগুলি কী হবে?

@ হেনরির পরামর্শ অনুসারে, ডট-অ্যাক্সেস ডিক্টে ব্যবহার নাও করা যেতে পারে তার একটি কারণ হ'ল এটি ডিক কী নামগুলিকে অজগর-বৈধ ভেরিয়েবলের মধ্যে সীমাবদ্ধ করে, যার ফলে সমস্ত সম্ভাব্য নাম সীমাবদ্ধ করে।

নীচে ডটেড-অ্যাক্সেস সাধারণভাবে কেন কার্যকর হবে না, তার উদাহরণ নীচে দেওয়া হয়েছে, একটি ডিক্ট দেওয়া হলে d:

বৈধতা

নিম্নলিখিত বৈশিষ্ট্যগুলি পাইথনে অবৈধ হবে:

d.1_foo                           # enumerated names
d./bar                            # path names
d.21.7, d.12:30                   # decimals, time
d.""                              # empty strings
d.john doe, d.denny's             # spaces, misc punctuation 
d.3 * x                           # expressions  

শৈলী

পিইপি 8 সম্মেলনগুলি অ্যাট্রিবিউট নামকরণের ক্ষেত্রে একটি নরম বাধা চাপিয়ে দেবে:

উ: সংরক্ষিত কীওয়ার্ড (বা বিল্টিন ফাংশন) নামগুলি:

d.in
d.False, d.True
d.max, d.min
d.sum
d.id

যদি কোনও ফাংশন আর্গুমেন্টের নামটি কোনও সংরক্ষিত কীওয়ার্ডের সাথে সংঘর্ষ হয় তবে সাধারণত একটি একক চলমান আন্ডারস্কোর যুক্ত করা আরও ভাল ...

খ। পদ্ধতি এবং পরিবর্তনশীল নামের ক্ষেত্রে রুল :

চলক নামগুলি একই কনভেনশনটিকে ফাংশন নাম হিসাবে অনুসরণ করে।

d.Firstname
d.Country

ফাংশন নামকরণের নিয়মগুলি ব্যবহার করুন: পাঠযোগ্যতার উন্নতির জন্য আন্ডারস্কোর দ্বারা পৃথক করা শব্দের সাথে ছোট হাতের অক্ষর।


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

যদি এই সীমাবদ্ধতাগুলি আপনার ব্যবহারের ক্ষেত্রে প্রয়োগ না করে তবে ডটেড-অ্যাক্সেস ডেটা স্ট্রাকচারের জন্য বেশ কয়েকটি বিকল্প রয়েছে ।


1

আপনি ডিক্ট_ টো_বজ ব্যবহার করতে পারেন https://pypi.org/project/dict-to-obj/ আপনি যা চেয়েছিলেন তা ঠিক তাই করে

From dict_to_obj import DictToObj
a = {
'foo': True
}
b = DictToObj(a)
b.foo
True

1
এটি আপনার কাছে রাখা ভাল ফর্ম .ideaএবং কোনও ব্যবহারকারী-নির্দিষ্ট বা আইডিই আপনার তৈরি ফাইল .gitignore
DeusXMachina

1

এটি 'উত্তম' উত্তর নয়, তবে আমি ভেবেছিলাম এটি নিফটি (এটি বর্তমান আকারে নেস্টেড ডিক্টগুলি পরিচালনা করে না)। কেবল কোনও কার্যক্রমে আপনার ডিকটি মোড়ানো:

def make_funcdict(d=None, **kwargs)
    def funcdict(d=None, **kwargs):
        if d is not None:
            funcdict.__dict__.update(d)
        funcdict.__dict__.update(kwargs)
        return funcdict.__dict__
    funcdict(d, **kwargs)
    return funcdict

এখন আপনার কিছুটা আলাদা সিনট্যাক্স রয়েছে। বৈশিষ্ট্য হিসাবে ডিক আইটেম অ্যাক্সেস করতে f.key। সাধারণ পদ্ধতিতে ডিক আইটেমগুলি (এবং অন্যান্য ডিক পদ্ধতি) অ্যাক্সেস করার জন্য করুন f()['key']এবং আমরা কীওয়ার্ড আর্গুমেন্ট এবং / অথবা একটি অভিধান দিয়ে এফ কল করে স্বাচ্ছন্দ্যে ডিকটি আপডেট করতে পারি

উদাহরণ

d = {'name':'Henry', 'age':31}
d = make_funcdict(d)
>>> for key in d():
...     print key
... 
age
name
>>> print d.name
... Henry
>>> print d.age
... 31
>>> d({'Height':'5-11'}, Job='Carpenter')
... {'age': 31, 'name': 'Henry', 'Job': 'Carpenter', 'Height': '5-11'}

এবং এটি আছে। কেউ যদি এই পদ্ধতির সুবিধাগুলি এবং ত্রুটিগুলি পরামর্শ দেয় তবে আমি খুশি হব।


0

ডগ দ্বারা উল্লিখিত হিসাবে একটি গুচ্ছ প্যাকেজ যা আপনি obj.keyকার্যকারিতা অর্জন করতে ব্যবহার করতে পারেন । আসলে একটি নতুন সংস্করণ বলা হয়

NeoBunch

এটি আপনার ডিককে এর মাধ্যমে একটি নব্যবঞ্চ অবজেক্টে রূপান্তর করার একটি দুর্দান্ত বৈশিষ্ট্য রয়েছে নিওবাঞ্চাইফাই ফাংশনটির করে। আমি মাকো টেমপ্লেটগুলি প্রচুর ব্যবহার করি এবং ডেওগুলি পাস করার ফলে নব্যবঞ্চ অবজেক্টগুলি সেগুলিকে আরও বেশি পঠনযোগ্য করে তোলে, তাই যদি আপনি আপনার পাইথন প্রোগ্রামে একটি সাধারণ ডিক ব্যবহার করে শেষ করেন তবে কোনও মাকো টেমপ্লেটে বিন্দু চিহ্নিতকরণ চান আপনি এটি সেভাবে ব্যবহার করতে পারেন:

from mako.template import Template
from neobunch import neobunchify

mako_template = Template(filename='mako.tmpl', strict_undefined=True)
data = {'tmpl_data': [{'key1': 'value1', 'key2': 'value2'}]}
with open('out.txt', 'w') as out_file:
    out_file.write(mako_template.render(**neobunchify(data)))

এবং মাকো টেমপ্লেটটি দেখতে পারে:

% for d in tmpl_data:
Column1     Column2
${d.key1}   ${d.key2}
% endfor

নিওবাঞ্চের লিঙ্কটি 404
ডিউজএক্সমাছিনা

0

সবচেয়ে সহজ উপায় একটি ক্লাস সংজ্ঞায়িত করা যাক যাকে এটিকে নেমস্পেস বলি। যা বস্তুর ব্যবহার অভি .update () অভি উপর। তারপরে, ডিককে একটি অবজেক্ট হিসাবে ধরা হবে।

class Namespace(object):
    '''
    helps referencing object in a dictionary as dict.key instead of dict['key']
    '''
    def __init__(self, adict):
        self.__dict__.update(adict)



Person = Namespace({'name': 'ahmed',
                     'age': 30}) #--> added for edge_cls


print(Person.name)
আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.