मुझे इसी उद्देश्य के लिए कुछ चाहिए था, लेकिन मेरे द्वारा परीक्षण किए गए सभी मामलों में से कोई भी मौजूदा उत्तर नहीं था। नादिया का जवाब, जो मैं देख रहा था, उसके सबसे करीब था, इसलिए मैंने आधार के रूप में उनके कोड के साथ शुरुआत की।
नीचे दिए गए डेकोरेटर तर्कों के सभी मान्य संयोजनों के साथ काम करते हैं:
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 )
यह मानक _
-prefix कन्वेंशन को -प्राकृतिक __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
सभी $
पात्रों को एक नई रेखा के साथ।
autoassign
एक्टिविस्ट रेसिपी की चर्चा , और वैकल्पिकautoargs
कार्यान्वयन पर भी देखें : पायथन में स्वचालित विशेषता असाइनमेंट करने का सबसे अच्छा तरीका क्या है, और क्या यह एक अच्छा विचार है? - स्टैक ओवरफ्लो