আমার একই উদ্দেশ্যে কিছু প্রয়োজন ছিল, তবে বিদ্যমান উত্তরগুলির মধ্যে আমার পরীক্ষিত সমস্ত মামলার জুড়েই কোনও উত্তর নেই। নাদিয়ার উত্তরটি আমি যা খুঁজছিলাম তার নিকটতম ছিল, তাই আমি তার কোডটি একটি বেস হিসাবে শুরু করেছি।
নীচের সাজসজ্জাটি যুক্তিযুক্ত সমস্ত বৈধ সংমিশ্রণের সাথে কাজ করে:
Positional __init__(self, a, b )
Keyword __init__(self, a=None, b=None )
Positional + Keyword __init__(self, a, b, c=None, d=None)
Variable Positional __init__(self, *a )
Variable Positional + Keyword __init__(self, *a, b=None )
Variable Positional + Variable Keyword __init__(self, *a, **kwargs )
Positional + Variable Positional + Keyword __init__(self, a, *b, c=None )
Positional + Variable Positional + Variable Keyword __init__(self, a, *b, **kwargs )
Keyword Only __init__(self, *, a=None )
Positional + Keyword Only __init__(self, a, *, b=None )
এটি শ্রেণীর দৃষ্টান্তগুলিতে বরাদ্দ করা হবে না এমন-প্রাইভেট ভেরিয়েবলগুলির _
জন্য অনুমতি দেওয়ার জন্য স্ট্যান্ডার্ড- প্রিফিক্স কনভেনশনটিও প্রয়োগ করে __init__
।
from functools import wraps
import inspect
def auto_assign_arguments(function):
@wraps(function)
def wrapped(self, *args, **kwargs):
_assign_args(self, list(args), kwargs, function)
function(self, *args, **kwargs)
return wrapped
def _assign_args(instance, args, kwargs, function):
def set_attribute(instance, parameter, default_arg):
if not(parameter.startswith("_")):
setattr(instance, parameter, default_arg)
def assign_keyword_defaults(parameters, defaults):
for parameter, default_arg in zip(reversed(parameters), reversed(defaults)):
set_attribute(instance, parameter, default_arg)
def assign_positional_args(parameters, args):
for parameter, arg in zip(parameters, args.copy()):
set_attribute(instance, parameter, arg)
args.remove(arg)
def assign_keyword_args(kwargs):
for parameter, arg in kwargs.items():
set_attribute(instance, parameter, arg)
def assign_keyword_only_defaults(defaults):
return assign_keyword_args(defaults)
def assign_variable_args(parameter, args):
set_attribute(instance, parameter, args)
POSITIONAL_PARAMS, VARIABLE_PARAM, _, KEYWORD_DEFAULTS, _, KEYWORD_ONLY_DEFAULTS, _ = inspect.getfullargspec(function)
POSITIONAL_PARAMS = POSITIONAL_PARAMS[1:]
if(KEYWORD_DEFAULTS ): assign_keyword_defaults (parameters=POSITIONAL_PARAMS, defaults=KEYWORD_DEFAULTS)
if(KEYWORD_ONLY_DEFAULTS): assign_keyword_only_defaults(defaults=KEYWORD_ONLY_DEFAULTS )
if(args ): assign_positional_args (parameters=POSITIONAL_PARAMS, args=args )
if(kwargs ): assign_keyword_args (kwargs=kwargs )
if(VARIABLE_PARAM ): assign_variable_args (parameter=VARIABLE_PARAM, args=args )
বিঃদ্রঃ:
আমি পরীক্ষাগুলি অন্তর্ভুক্ত করেছি, কিন্তু সংক্ষিপ্ততার জন্য এগুলি শেষ লাইনে ( 58 ) ভেঙে ফেলেছি । আপনি পরীক্ষাগুলি প্রসারিত করতে পারেন, যা সম্ভাব্য ব্যবহারের সমস্ত ক্ষেত্রেই একটি নতুন লাইন দিয়ে find/replace
সমস্ত $
অক্ষরকে বিস্তৃত করে দেয় detail
autoassign
অ্যাক্টিস্টেট রেসিপি এবং এখানে একটি বিকল্পautoargs
বাস্তবায়ন সম্পর্কেও আলোচনা দেখুন : পাইথনে স্বয়ংক্রিয় বৈশিষ্ট্য কার্যনির্বাহনের সর্বোত্তম উপায় কোনটি এবং এটি কী ভাল ধারণা? - স্ট্যাক ওভারফ্লো