উত্তর:
এটার মত:
host = connectionDetails.get('host', someDefaultValue)
if/else
এটি আরও দ্রুত। এটি সম্ভবত ভূমিকা নিতে পারে বা নাও পারে।
if/else
দ্রুত কেন একটি রেফারেন্স দিতে পারেন ?
আপনি এটির defaultdict
মতো ব্যবহার করতে পারেন:
from collections import defaultdict
a = defaultdict(lambda: "default", key="some_value")
a["blabla"] => "default"
a["key"] => "some_value"
ল্যাম্বদার পরিবর্তে আপনি কোনও সাধারণ ক্রিয়াকলাপটি পাস করতে পারেন:
from collections import defaultdict
def a():
return 4
b = defaultdict(a, key="some_value")
b['absent'] => 4
b['key'] => "some_value"
get
বা অনুরূপ পদ্ধতির সাথে খাপ খায় না ।
যদিও .get()
একটি দুর্দান্ত প্রতিভা, এটির চেয়ে ধীর if/else
(এবং try/except
অভিধানে কীটির উপস্থিতি বেশিরভাগ সময় আশা করা যায় তার চেয়ে ধীর ):
>>> timeit.timeit(setup="d={1:2, 3:4, 5:6, 7:8, 9:0}",
... stmt="try:\n a=d[1]\nexcept KeyError:\n a=10")
0.07691968797894333
>>> timeit.timeit(setup="d={1:2, 3:4, 5:6, 7:8, 9:0}",
... stmt="try:\n a=d[2]\nexcept KeyError:\n a=10")
0.4583777282275605
>>> timeit.timeit(setup="d={1:2, 3:4, 5:6, 7:8, 9:0}",
... stmt="a=d.get(1, 10)")
0.17784020746671558
>>> timeit.timeit(setup="d={1:2, 3:4, 5:6, 7:8, 9:0}",
... stmt="a=d.get(2, 10)")
0.17952161730158878
>>> timeit.timeit(setup="d={1:2, 3:4, 5:6, 7:8, 9:0}",
... stmt="if 1 in d:\n a=d[1]\nelse:\n a=10")
0.10071221458065338
>>> timeit.timeit(setup="d={1:2, 3:4, 5:6, 7:8, 9:0}",
... stmt="if 2 in d:\n a=d[2]\nelse:\n a=10")
0.06966537335119938
if/then
দ্রুত হবে। উভয় ক্ষেত্রেই একটি লুকআপ অভিধান প্রয়োজন, এবং যদি না নামোচ্চারণের get()
হয় তাই অনেক ধীর ছাড়া আর কী মন্দার জন্য অ্যাকাউন্টসের?
O(1)
অভিধানের আকার নির্বিশেষে, সুতরাং ফাংশন কল ওভারহেড প্রাসঙ্গিক।
একাধিক ভিন্ন ডিফল্টর জন্য এটি ব্যবহার করে দেখুন:
connectionDetails = { "host": "www.example.com" }
defaults = { "host": "127.0.0.1", "port": 8080 }
completeDetails = {}
completeDetails.update(defaults)
completeDetails.update(connectionDetails)
completeDetails["host"] # ==> "www.example.com"
completeDetails["port"] # ==> 8080
None
বিবরণগুলি সরবরাহ করা হয় বা খালি স্ট্রিংকে মূল-মান জোড়গুলির মানগুলির মধ্যে একটি হিসাবে সরবরাহ করা হয় । defaults
অভিধান সম্ভাব্য তার মান এক অনিচ্ছাকৃতভাবে আউট blanked ফেলতে পারে। (এছাড়াও দেখুন stackoverflow.com/questions/6354436 )
এটি করার জন্য অজগর অভিধানগুলিতে একটি পদ্ধতি রয়েছে: dict.setdefault
connectionDetails.setdefault('host',someDefaultValue)
host = connectionDetails['host']
তবে এই পদ্ধতি মূল্য নির্ধারণ connectionDetails['host']
করার জন্য someDefaultValue
যদি চাবি host
ইতিমধ্যে সংজ্ঞায়িত করা হয় না, কি প্রশ্ন জিজ্ঞাসা অসদৃশ।
setdefault()
আয় মান, তাই এই হিসাবে ভাল কাজ করে: host = connectionDetails.setdefault('host', someDefaultValue)
। কেবল সাবধান যে connectionDetails['host']
কীটি আগে সেখানে না থাকলে এটি ডিফল্ট মান সেট করে।
(এটি একটি দেরী উত্তর)
dict
ক্লাসের সাবক্লাস করা এবং __missing__()
পদ্ধতিটি প্রয়োগ করা এর বিকল্প হিসাবে রয়েছে :
class ConnectionDetails(dict):
def __missing__(self, key):
if key == 'host':
return "localhost"
raise KeyError(key)
উদাহরণ:
>>> connection_details = ConnectionDetails(port=80)
>>> connection_details['host']
'localhost'
>>> connection_details['port']
80
>>> connection_details['password']
Traceback (most recent call last):
File "python", line 1, in <module>
File "python", line 6, in __missing__
KeyError: 'password'
পাইথনের ৩.৩.৫ এর জন্য পাইপাইয়ের (5.2.0-alpha0) পরিস্থিতি সম্পর্কে @ টিম পিটজ্যাকারের সন্দেহ পরীক্ষা করে, আমি দেখতে পেয়েছি যে প্রকৃতপক্ষে .get()
এবং if
/ else
উপায় উভয়ই একই রকম সম্পাদন করেছে। আসলে এটি মনে হয় যে / যদি অন্য ক্ষেত্রে শর্ত এবং অ্যাসাইনমেন্ট একই কী জড়িত থাকে তবে কেবলমাত্র একটি একক অনুসন্ধান রয়েছে (যেখানে দুটি লকআপ রয়েছে সেখানে শেষ কেসের সাথে তুলনা করুন)।
>>>> timeit.timeit(setup="d={1:2, 3:4, 5:6, 7:8, 9:0}",
.... stmt="try:\n a=d[1]\nexcept KeyError:\n a=10")
0.011889292989508249
>>>> timeit.timeit(setup="d={1:2, 3:4, 5:6, 7:8, 9:0}",
.... stmt="try:\n a=d[2]\nexcept KeyError:\n a=10")
0.07310474599944428
>>>> timeit.timeit(setup="d={1:2, 3:4, 5:6, 7:8, 9:0}",
.... stmt="a=d.get(1, 10)")
0.010391917996457778
>>>> timeit.timeit(setup="d={1:2, 3:4, 5:6, 7:8, 9:0}",
.... stmt="a=d.get(2, 10)")
0.009348208011942916
>>>> timeit.timeit(setup="d={1:2, 3:4, 5:6, 7:8, 9:0}",
.... stmt="if 1 in d:\n a=d[1]\nelse:\n a=10")
0.011475925013655797
>>>> timeit.timeit(setup="d={1:2, 3:4, 5:6, 7:8, 9:0}",
.... stmt="if 2 in d:\n a=d[2]\nelse:\n a=10")
0.009605801998986863
>>>> timeit.timeit(setup="d={1:2, 3:4, 5:6, 7:8, 9:0}",
.... stmt="if 2 in d:\n a=d[2]\nelse:\n a=d[1]")
0.017342638995614834
আপনি ওয়ান লাইনার হিসাবে এটির জন্য একটি ল্যাম্বা ফাংশন ব্যবহার করতে পারেন। একটি নতুন অবজেক্ট তৈরি করুন connectionDetails2
যা কোনও ফাংশনের মতো অ্যাক্সেস করা ...
connectionDetails2 = lambda k: connectionDetails[k] if k in connectionDetails.keys() else "DEFAULT"
এখন ব্যবহার করুন
connectionDetails2(k)
পরিবর্তে
connectionDetails[k]
k
কীগুলিতে থাকলে অভিধানের মানটি দেয় , অন্যথায় এটি প্রত্যাবর্তন করে"DEFAULT"