পাইথন ৩.৪++-তে, ডিক ব্যবহার না করার সময় কেন সরলনামস্পেসের উপরে নেমটুপল ব্যবহার করা উচিত, এগুলি দেখতে খুব সাদৃশ্যপূর্ণ বলে মনে হচ্ছে


11

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

আমি ঘুরতে চাই ...

def do_something(ax, ay, az, bu, bv, c):
    # Do something

... মধ্যে ...

def do_something(a, b, c):
    # Do something

... যেখানে aএবং bতাদের উপবিভাজনগুলি ধারণ করে।

এটি করার একটি উপায় হ'ল:

A = namedtuple('A', 'x, y, z')
a = A(ax, ay, az)
B = namedtuple('B', 'u, v')
b = B(bu, bv)

তবে এটি সহজ বলে মনে হচ্ছে:

a = SimpleNamespace(x=ax, y=ay, z=az)
b = SimpleNamespace(u=bu, v=bv)

অপূর্ণতা কী? যে সত্য aএবং bভাল টাইপ করা হয় না? এগুলি কি এ এবং বি অবজেক্ট নয়?

(বিটিডব্লিউ, ভেরিয়েবলের নামগুলি নিয়ে চিন্তা করবেন না I আমি সাধারণত সংক্ষিপ্ত পরিবর্তনশীল নাম হিসাবে ব্যবহার করি না))


1
প্রতি সেটের কোনও ত্রুটি নেই, তারা কেবল ভিন্ন জিনিস। স্টার্টারের জন্য নেমটুপলগুলি অবিচ্ছেদ্য এবং নেমস্পেসগুলি পরিবর্তনীয়। পরিবর্তনীয় কি অনির্বচনীয় চেয়ে ভাল বা খারাপ? এটি আপনার যা প্রয়োজন বা তার উপর নির্ভর করে, অনেক ক্ষেত্রে এটি কিছু যায় আসে না। আপনার ফাংশনটি সম্ভবত প্রয়োজনীয় বৈশিষ্ট্যগুলির সাথে যে কোনও অবজেক্টের সাথে কাজ করবে, কীভাবে এটি তৈরি করা যায় তা কলারের উপর নির্ভর করে।
মনিকার ক্ষতি করতে বন্ধ করুন

@ গায়ো ধন্যবাদ "অপূর্ণতা" জিনিসটি এটি বলার একটি আনাড়ি উপায় ছিল। আমি বোঝাতে চাইছি না যে একজন অন্যজনের চেয়ে স্বভাবগতভাবেই ভাল। শুধু ভাল এবং কনস চেয়েছিলেন। আবার ধন্যবাদ.
আন্দ্রে ক্রিস্টোফার অ্যান্ডারসন

1
চতুর্থ লাইনের "b = B (বু, বিভি)" এর মতো দেখতে পাওয়া উচিত নয়?
অ্যালেন সিলজাক

@ অ্যালেনসিলজাক হ্যাঁ এটি করা উচিত। আমি এখনই এটি ঠিক করব।
আন্দ্রে ক্রিস্টোফার অ্যান্ডারসন

উত্তর:


21

SimpleNamespaceমূলত একটি অভিধানের শীর্ষে একটি সুন্দর মুখোমুখি। এটি আপনাকে সূচি কীগুলির পরিবর্তে বৈশিষ্ট্যগুলি ব্যবহার করতে দেয়। এটি দুর্দান্ত নমনীয় এবং ম্যানিপুলেট করা সহজ as

এই নমনীয়তার ক্ষতি হচ্ছে এটি কোনও কাঠামো সরবরাহ করে না। কাউকে কল করা থেকে বিরত করার কিছু নেই SimpleNamespace(x=ax, y=ay)(এবং del a.zপরে কোনও সময়ে)। যদি এই দৃষ্টান্তটি আপনার ফাংশনে পৌঁছে যায় তবে আপনি ক্ষেত্রটি অ্যাক্সেস করার চেষ্টা করলে ব্যতিক্রম ঘটে।

বিপরীতে, namedtupleআপনাকে একটি কাঠামোগত প্রকার তৈরি করতে দেয়। প্রকারটির একটি নাম থাকবে এবং এটি জানতে পারে এটির কোন ক্ষেত্রগুলি থাকার কথা। আপনি এই ক্ষেত্রগুলির প্রত্যেকটি ছাড়া একটি উদাহরণ তৈরি করতে সক্ষম হবেন না এবং সেগুলি পরে মুছে ফেলা যাবে না। অতিরিক্তভাবে, উদাহরণটি অপরিবর্তনীয়, সুতরাং আপনি জানবেন যে মানটি a.xসর্বদা একই থাকবে।

এটা তোলে যদি আপনি নমনীয়তা যে প্রয়োজন সিদ্ধান্ত নিতে আপনার উপরে নির্ভর করে SimpleNamespaceআপনি দেয়, অথবা যদি আপনি গঠন এবং নিশ্চয়তা দ্বারা উপলব্ধ আছে পছন্দ namedtuple


2

কাঠামোগত বনাম না সম্পর্কিত উত্তরটি আমি সত্যিই পছন্দ করি, সুতরাং আমি নীচে কেবল একটি নিখরচায় উদাহরণ দিচ্ছি।

SimpleNamespaceকীগুলি শুরু হবে তা গ্রহণ করবে _। আপনি যদি ঘুরে দেখার দ্রুত এবং সহজ উপায়ের সন্ধান করছেন, বলুন, জেএসওএন আপনি ক্ষেত্রের নাম সহ কোনও বস্তুগুলিতে নিয়ন্ত্রণ করেন না, এটি খুব সহজ:

d = {"_id": 2342122, "text": "hi there!"} # Elasticsearch gives this id!
e = SimpleNamespace(**d) # works
Name = namedtuple("Name", sorted(d)) # ValueError so we can't do Name(**d)

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


1

সার সংক্ষেপ SimpleNamespace

এটি অবজেক্টটি নির্মাণের সময় বৈশিষ্ট্যগুলি শুরু করতে দেয়:

sn = SimpleNamespace(a=1, b=2)

এটি একটি পঠনযোগ্য সরবরাহ করে

repr(): eval(repr(sn)) == sn

এটি ডিফল্ট তুলনা ওভাররাইড করে। এর সাথে তুলনা না করে পরিবর্তে id()এটি বৈশিষ্ট্যের মানগুলির সাথে তুলনা করে।

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