পাইথন আরগপার্স.নামস্পেস () অভিধান হিসাবে বিবেচনা করার সঠিক উপায় কী?


228

আমি যদি কোনও argparse.ArgumentParser()শব্দটি Namespaceঅভিধান বা ম্যাপিংয়ের মতো কোনও বস্তুর প্রত্যাশা করে এমন কোনও পদ্ধতি সহ (কোন সংগ্রহটি দেখুন M ম্যাপিং ) এর ফলাফলগুলি ব্যবহার করতে চাই , তবে এটি করার সঠিক উপায় কী?

C:\>python
Python 2.7.3 (default, Apr 10 2012, 23:31:26) [MSC v.1500 32 bit (Intel)] on win
32
Type "help", "copyright", "credits" or "license" for more information.
>>> import argparse
>>> args = argparse.Namespace()
>>> args.foo = 1
>>> args.bar = [1,2,3]
>>> args.baz = 'yippee'
>>> args['baz']
Traceback (most recent call last):
  File "<stdin>", line 1, in <module>
TypeError: 'Namespace' object has no attribute '__getitem__'
>>> dir(args)
['__class__', '__contains__', '__delattr__', '__dict__', '__doc__', '__eq__', '_
_format__', '__getattribute__', '__hash__', '__init__', '__module__', '__ne__',
'__new__', '__reduce__', '__reduce_ex__', '__repr__', '__setattr__', '__sizeof__
', '__str__', '__subclasshook__', '__weakref__', '_get_args', '_get_kwargs', 'ba
r', 'baz', 'foo']

কোনও বস্তুর "পৌঁছনো" এবং এর __dict__সম্পত্তিটি ব্যবহার করা কি উপযুক্ত ?

আমি মনে করি হবে উত্তর নেই: __dict__বাস্তবায়নের জন্য একটি কনভেনশন মত গন্ধ পাচ্ছি, কিন্তু একটি ইন্টারফেস, পথ না __getattribute__বা __setattr__বা __contains__বলে মনে হচ্ছে।

উত্তর:


384

আপনি নাম (স্পেস) এর সাথে অভিধানের অভিধানটি অ্যাক্সেস করতে পারবেন :

>>> import argparse
>>> args = argparse.Namespace()
>>> args.foo = 1
>>> args.bar = [1,2,3]
>>> d = vars(args)
>>> d
{'foo': 1, 'bar': [1, 2, 3]}

আপনি চাইলে ডিকশনারিটি সরাসরি সংশোধন করতে পারেন:

>>> d['baz'] = 'store me'
>>> args.baz
'store me'

হ্যাঁ, __dict__ বৈশিষ্ট্যটি অ্যাক্সেস করা ঠিক আছে। এটি একটি সংজ্ঞায়িত, পরীক্ষিত এবং গ্যারান্টিযুক্ত আচরণ।


1
দস্তাবেজগুলি বলে: "প্রত্যাবর্তিত অভিধানটি সংশোধন করা উচিত নয়: সংশ্লিষ্ট প্রতীক টেবিলের উপর প্রভাবগুলি অপরিবর্তিত।" কোনটি হতে পারে শুধুমাত্র আচরণকে পড়ুন vars()(যা পারেন হয় locals()বা globals()), কিন্তু আমি নই সত্যিই নিশ্চিত।

2
হুম, আমি সত্যিই ব্যবহার মধ্যে পার্থক্য বুঝতে পারছি না vars()এবং__dict__
জেসন এস

21
@ ডেলানন কেউ ডক্সে একটি ভুল সম্পাদনা করে একটি অতিরিক্ত-বিস্তৃত উপদেশ দিয়েছিল। ডক্সগুলি পরবর্তীকালে সংশোধন করা হয়েছিল। ডকস.পিথোন.আর. / ২..7 / লিবারি / ফাংশনস html#vars দেখুন যখন কেবলমাত্র পাঠযোগ্য অভিধান রয়েছে (যেমন স্থানীয় এবং শ্রেণি অভিধানের প্রক্সি) এমন কয়েকটি বিশেষ ক্ষেত্রে রয়েছে, তবে বাকী কেসগুলি আপডেটযোগ্য। Vars (obj) কল সমার্থক সঙ্গে obj .__ dict__ হয়। আরগপার্স নেমস্পেসের ক্ষেত্রে, ভার্স ( আর্টস ) একটি আপডেটযোগ্য অভিধানে সরাসরি অ্যাক্সেস দেয়।
রেমন্ড হেটেঞ্জার

1
@ রেমন্ড হিট্টিংগার ঠিক আছে, ঝরঝরে। /3/দস্তাবেজের সংস্করণ থেকে আমি এই নোটটি পেয়েছি (কাছাকাছি পরিদর্শন করার সময়, 3.1 থেকে 3.4 সহ), সুতরাং সংশোধনটি সেখানে দৃশ্যত অনুপস্থিত is

8
@ ডেলানান আমি সবেমাত্র 3.3 এবং 3.3 ডক্স আপডেট করেছি। আগামীকাল তা দৃশ্যমান হবে। এটা ইশারা জন্য ধন্যবাদ।
রেমন্ড হেটেঞ্জার

64

সোজা ঘোড়ার মুখ থেকে :

আপনি যদি গুণাবলী সম্পর্কে ডিকের মত দৃষ্টিভঙ্গি পছন্দ করেন তবে আপনি স্ট্যান্ডার্ড পাইথন আইডিয়ামটি ব্যবহার করতে পারেন vars():

>>> parser = argparse.ArgumentParser()
>>> parser.add_argument('--foo')
>>> args = parser.parse_args(['--foo', 'BAR'])
>>> vars(args)
{'foo': 'BAR'}

- পাইথন স্ট্যান্ডার্ড লাইব্রেরি, 16.4.4.6। নেমস্পেস অবজেক্ট


1
তবুও 'ফু' মিস করে '-'। কোন ধারণা?
ব্যবহারকারী2678074

1
@ user2678074 এটি শেল পতাকা মেলে ইচ্ছাকৃত। ড্যাশগুলি অজগর নির্বাহের ভিতরে বহিরাগত।
এরিখ

vars(args)আমাকে দেয়TypeError: 'dict' object is not callable
ব্যবহারকারীর 35359531

6
@ user5359531 আপনি সম্ভবত varsএকটি পরিবর্তনশীল সহ গ্লোবাল ওভাররোট করতে পারেন । আপনি __builtins__.varsএটিকে সরাসরি অ্যাক্সেস করতে বা del varsএটি ছায়া ছড়ানো বন্ধ করতে ব্যবহার করতে পারেন ।
নিক টি 20

@ নিকট মাইনর সংশোধন: পাইথন ফাংশনগুলি স্থিতিশীলভাবে স্কোপ করা হয় তাই আপনি যদি কোনও ফাংশনে কোনও বিশ্বব্যাপী পরিবর্তনশীলকে ছায়ামুক্ত করেন তবে সনাক্তকারীটি নির্ধারিত হওয়ার আগে বা পরে তার আগেও সেই ফাংশনের মধ্যে স্থানীয় ভেরিয়েবলটি উল্লেখ করবে del। মডিউল স্কোপটিতে "আন-শ্যাডো" বিল্টিনগুলিতে কাজ del করবে
augurar

-1

এটা একটি বস্তু "মধ্যে পৌঁছাতে" কি সঠিক হয়েছে এবং এটি ব্যবহার করার অভি সম্পত্তি?

সাধারণভাবে, আমি "না" বলব। তবে Namespaceআমাকে অতিরিক্ত ইঞ্জিনিয়ারিং হিসাবে আঘাত করেছে, সম্ভবত যখন থেকে অন্তর্নির্মিত ধরণের থেকে ক্লাসগুলি উত্তরাধিকারী হতে পারে না।

অন্যদিকে, Namespaceআরগপার্সে কোনও কার্য-ভিত্তিক দৃষ্টিভঙ্গি উপস্থাপন করে এবং আমি এমন পরিস্থিতিটি ভাবতে পারি না যা দখল করার জন্য আহ্বান জানায় __dict__, তবে আমার ধারণার সীমা আপনার মতো নয়।


11
__ডিক্ট__ বৈশিষ্ট্যটি অ্যাক্সেস করা পুরোপুরি ঠিক। অন্তর্দৃষ্টি ভাষার মৌলিক is বৈশিষ্ট্যটি একটি কারণে প্রকাশ্যে প্রকাশ করা হয়েছিল :-)
রেমন্ড হেটিঙ্গার

8
তবে পাইথনের সমস্ত কিছুই "পাবলিক"। উদাহরণ হিসাবে ব্যবহৃত বাস্তবায়ন ভেরিয়েবল এবং এটি যে সর্বজনীন ইন্টারফেসটি উপস্থাপন করে তার মধ্যে কোনও পার্থক্য নেই (শীর্ষস্থানীয় আন্ডারস্কোর সম্মেলন ব্যতীত)। বিশেষত অভিধানের মতো বস্তুতে: উদাহরণ পদ্ধতিগুলির সাথে লাইন এবং অভিধান মানগুলি যা কার্যকরী হয় তা কিছুটা ঝাপসা।
জেসন এস

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