মনে করুন আমি একটি সজ্জা রচনা লিখেছি যা খুব সাধারণ কিছু করে। উদাহরণস্বরূপ, এটি সমস্ত যুক্তিগুলিকে একটি নির্দিষ্ট ধরণের রূপান্তর করতে পারে, লগিং সম্পাদন করতে পারে, মেমোয়াইজেশন বাস্তবায়ন করতে পারে ইত্যাদি etc.
এখানে একটি উদাহরণ:
def args_as_ints(f):
def g(*args, **kwargs):
args = [int(x) for x in args]
kwargs = dict((k, int(v)) for k, v in kwargs.items())
return f(*args, **kwargs)
return g
@args_as_ints
def funny_function(x, y, z=3):
"""Computes x*y + 2*z"""
return x*y + 2*z
>>> funny_function("3", 4.0, z="5")
22
এখন পর্যন্ত সবকিছু ঠিক আছে। তবে একটি সমস্যা আছে। সজ্জিত ফাংশনটি মূল ফাংশনের ডকুমেন্টেশন ধরে রাখে না:
>>> help(funny_function)
Help on function g in module __main__:
g(*args, **kwargs)
ভাগ্যক্রমে, সেখানে একটি কার্যনির্বাহী রয়েছে:
def args_as_ints(f):
def g(*args, **kwargs):
args = [int(x) for x in args]
kwargs = dict((k, int(v)) for k, v in kwargs.items())
return f(*args, **kwargs)
g.__name__ = f.__name__
g.__doc__ = f.__doc__
return g
@args_as_ints
def funny_function(x, y, z=3):
"""Computes x*y + 2*z"""
return x*y + 2*z
এবার, ফাংশনের নাম এবং ডকুমেন্টেশন সঠিক:
>>> help(funny_function)
Help on function funny_function in module __main__:
funny_function(*args, **kwargs)
Computes x*y + 2*z
তবে এখনও একটি সমস্যা রয়েছে: ফাংশনের স্বাক্ষরটি ভুল। "* আরগস, ** কাওয়ার্গস" তথ্যটি অকেজো হওয়ার পরে রয়েছে।
কি করো? আমি দুটি সহজ তবে ত্রুটিযুক্ত কাজের কথা ভাবতে পারি:
1 - ডকস্ট্রিংয়ে সঠিক স্বাক্ষর অন্তর্ভুক্ত করুন:
def funny_function(x, y, z=3):
"""funny_function(x, y, z=3) -- computes x*y + 2*z"""
return x*y + 2*z
সদৃশতার কারণে এটি খারাপ। স্বাক্ষরটি এখনও স্বয়ংক্রিয়ভাবে উত্পন্ন ডকুমেন্টেশনে সঠিকভাবে প্রদর্শিত হবে না। ফাংশনটি আপডেট করা এবং ডকাস্ট্রিং পরিবর্তন করা বা টাইপ করা ভুলে যাওয়া সহজ। [ এবং হ্যাঁ, আমি এই বিষয়ে সচেতন যে ডক্টরসিং ইতিমধ্যে ফাংশন বডিটিকে নকল করে। দয়া করে এটিকে উপেক্ষা করুন; ফানি_ফানশানটি কেবল একটি এলোমেলো উদাহরণ। ]
2 - কোনও ডেকরেটর ব্যবহার করবেন না, বা প্রতিটি নির্দিষ্ট স্বাক্ষরের জন্য একটি বিশেষ-উদ্দেশ্য সজ্জা ব্যবহার করবেন না:
def funny_functions_decorator(f):
def g(x, y, z=3):
return f(int(x), int(y), z=int(z))
g.__name__ = f.__name__
g.__doc__ = f.__doc__
return g
এটি অভিন্ন স্বাক্ষরযুক্ত ফাংশনগুলির একটি সেটের জন্য সূক্ষ্ম কাজ করে তবে এটি সাধারণভাবে অকেজো। আমি প্রথমদিকে যেমন বলেছিলাম, আমি সজ্জিতগুলি পুরো উদারভাবে ব্যবহার করতে সক্ষম হতে চাই।
আমি এমন একটি সমাধান খুঁজছি যা সম্পূর্ণরূপে সাধারণ এবং স্বয়ংক্রিয়।
সুতরাং প্রশ্নটি হল: সজ্জিত ফাংশন স্বাক্ষরটি তৈরির পরে কি সম্পাদনা করার কোনও উপায় আছে?
অন্যথায়, আমি কি কোনও সাজসজ্জা লিখতে পারি যা ফাংশনের স্বাক্ষরটি বের করে এবং সজ্জিত ফাংশনটি নির্মাণের সময় "* কাওয়ার্গস, ** কাওয়ারস" এর পরিবর্তে সেই তথ্য ব্যবহার করে? আমি কীভাবে এই তথ্যটি বের করব? আমি কীভাবে সজ্জিত ফাংশনটি তৈরি করব - এক্সিকিউট সহ?
অন্য কোন পন্থা?
inspect.Signatureসজ্জিত ফাংশনগুলি মোকাবেলায় কী যুক্ত করেছে।