প্রচুর উত্তরের সম্পূর্ণ তথ্যের সামান্য অংশ রয়েছে, তাই আমি এগুলি আমার প্রিয় প্যাটার্নগুলির সাথে একত্রিত করতে চাই।
ডিফল্ট মান একটি mutable
প্রকার
যদি ডিফল্ট মানটি পরিবর্তনীয় অবজেক্ট হয় তবে আপনি ভাগ্যবান: ফাংশনটি সংজ্ঞায়িত হয়ে গেলে পাইথনের ডিফল্ট যুক্তিগুলি একবার মূল্যায়ন করা হয় (আপনি শেষ বিভাগের উত্তরের শেষে আরও কিছু) এই সত্যটি কাজে লাগাতে পারেন
এর অর্থ আপনি is
নিম্নলিখিতটি ফাংশন বা পদ্ধতি হিসাবে উদাহরণ হিসাবে যেমন আর্গুমেন্ট হিসাবে পাস করেছেন বা ডিফল্ট হিসাবে রেখে গেছেন তা দেখতে আপনি সহজেই একটি ডিফল্ট মিউটেবল মান তুলনা করতে পারেন :
def f(value={}):
if value is f.__defaults__[0]:
print('default')
else:
print('passed in the call')
এবং
class A:
def f(self, value={}):
if value is self.f.__defaults__[0]:
print('default')
else:
print('passed in the call')
অপরিবর্তনীয় ডিফল্ট যুক্তি
এখন, এটি যদি আপনার ডিফল্টটির immutable
মান হিসাবে প্রত্যাশিত হয় তবে এটি কিছুটা কম মার্জিত হয় (এবং মনে রাখবেন যে স্ট্রিংগুলিও অপরিবর্তনীয়!) কারণ আপনি কৌশলটি যেমনটি ব্যবহার করতে পারেন তেমন ব্যবহার করতে পারবেন না, তবে এখনও এমন কিছু আছে যা আপনি করতে পারেন, তবুও পরিবর্তনশীলকে শোষণ করে প্রকার; মূলত আপনি ফাংশনের স্বাক্ষরে একটি পরিবর্তনীয় "নকল" ডিফল্ট এবং ফাংশন বডিটিতে পছন্দসই "আসল" ডিফল্ট মান রেখেছেন ।
def f(value={}):
"""
my function
:param value: value for my function; default is 1
"""
if value is f.__defaults__[0]:
print('default')
value = 1
else:
print('passed in the call')
print(value)
এটি যদি আপনার সত্যিকারের ডিফল্ট হয় None
তবে None
এটি মজাদার অনুভূত হয় তবে তা পরিবর্তনযোগ্য নয় ... আপনার এখনও স্পষ্টতই ফাংশন ডিফল্ট প্যারামিটার হিসাবে একটি পরিবর্তনীয় ব্যবহার করতে হবে এবং কোডটিতে কোনওটিতেই স্যুইচ করতে হবে না।
একটি ব্যবহার Default
অপরিবর্তনীয় অক্ষমতা জন্য ক্লাস
বা, @cz পরামর্শের অনুরূপ, যদি পাইথন ডক্স পর্যাপ্ত না থাকে :-), আপনি এপিআইকে আরও স্পষ্ট করে তুলতে (ডক্সগুলি না পড়ে) এর মধ্যে একটি বস্তু যুক্ত করতে পারেন; ব্যবহৃত_প্রক্সি_ ডিফল্ট শ্রেণীর উদাহরণটি পরিবর্তনযোগ্য এবং এতে আপনি ব্যবহার করতে চান এমন আসল ডিফল্ট মান থাকবে।
class Default:
def __repr__(self):
return "Default Value: {} ({})".format(self.value, type(self.value))
def __init__(self, value):
self.value = value
def f(default=Default(1)):
if default is f.__defaults__[0]:
print('default')
print(default)
default = default.value
else:
print('passed in the call')
print("argument is: {}".format(default))
এখন:
>>> f()
default
Default Value: 1 (<class 'int'>)
argument is: 1
>>> f(2)
passed in the call
argument is: 2
উপরোক্ত এছাড়াও জন্য ভাল কাজ করে Default(None)
।
অন্যান্য নিদর্শন
স্পষ্টতই উপরের নিদর্শনগুলি তাদের দেখতে চেয়ে দেখতে দেখতে আরও খারাপ দেখায় কারণ সেগুলিতে কেবল তারা print
কীভাবে কাজ করে তা দেখানোর জন্য রয়েছে। অন্যথায় আমি এগুলি পরিশ্রুত এবং যথেষ্ট পুনরাবৃত্তিযোগ্য মনে করি।
আপনি __call__
আরও একটি সুশৃঙ্খল উপায়ে @dmg দ্বারা প্রস্তাবিত প্যাটার্নটি যুক্ত করতে কোনও ডেকরেটর লিখতে পারেন , তবে এটি এখনও ফাংশন সংজ্ঞাতে অদ্ভুত কৌশলগুলি ব্যবহার করতে বাধ্য হবে - আপনাকে আলাদা করতে হবে value
এবং value_default
যদি আপনার কোডটি তাদের আলাদা করার প্রয়োজন হয়, তাই আমি খুব বেশি সুবিধা দেখছি না এবং উদাহরণটি লিখব না :-)
পাইথনে ডিফল্ট মান হিসাবে পরিবর্তনীয় প্রকারগুলি
# 1 অজগর সম্পর্কে আরও কিছু ! , উপরে আপনার নিজের সন্তুষ্টি জন্য আপত্তিজনক। সংজ্ঞাটি মূল্যায়নের ফলে যা ঘটে তা আপনি দেখতে পাচ্ছেন :
def testme(default=[]):
print(id(default))
আপনি testme()
যতটা সময় চালাতে পারেন, আপনি সর্বদা একই ডিফল্ট উদাহরণের জন্য একটি রেফারেন্স দেখতে পাবেন (সুতরাং মূলত আপনার ডিফল্টটি পরিবর্তনযোগ্য :-))।
মনে রাখবেন পাইথন মধ্যে আছে মাত্র 3 চপল বিল্ট-ইন ধরনের : set
, list
, dict
; সব কিছু - এমনকি স্ট্রিং! - অপরিবর্তনীয়।