যদি আপনার কোডটিতে #fdef উইন্ডোজ / # এন্ডিফের মতো একই ধরণের প্রভাব রাখার লক্ষ্য হয় .. এটি করার একটি উপায় এখানে রয়েছে (আমি একটি ম্যাক বিটিডব্লুতে আছি)।
সিম্পল কেস, নো চেইনিং
>>> def _ifdef_decorator_impl(plat, func, frame):
... if platform.system() == plat:
... return func
... elif func.__name__ in frame.f_locals:
... return frame.f_locals[func.__name__]
... else:
... def _not_implemented(*args, **kwargs):
... raise NotImplementedError(
... f"Function {func.__name__} is not defined "
... f"for platform {platform.system()}.")
... return _not_implemented
...
...
>>> def windows(func):
... return _ifdef_decorator_impl('Windows', func, sys._getframe().f_back)
...
>>> def macos(func):
... return _ifdef_decorator_impl('Darwin', func, sys._getframe().f_back)
সুতরাং এই প্রয়োগের মাধ্যমে আপনি আপনার প্রশ্নে একই সিনট্যাক্স পাবেন।
>>> @macos
... def zulu():
... print("world")
...
>>> @windows
... def zulu():
... print("hello")
...
>>> zulu()
world
>>>
উপরের কোডটি যা করছে তা মূলত প্ল্যাটফর্মের সাথে মিলে জুলুকে জুলুকে বরাদ্দ করে। প্ল্যাটফর্মটি যদি মেলে না তবে এটি জুলুটিকে পূর্বে সংজ্ঞায়িত করা হলে ফিরে আসবে। যদি এটি সংজ্ঞায়িত না করা হয়, তবে এটি একটি স্থানধারক ফাংশন প্রদান করে যা একটি ব্যতিক্রম উত্থাপন করে।
আপনি যদি মনে রাখেন তবে সজ্জাবিদরা ধারণাটি সহজেই নির্ধারণ করতে পারবেন
@mydecorator
def foo():
pass
এর সাথে সাদৃশ্যপূর্ণ:
foo = mydecorator(foo)
প্যারামিটারাইজড ডেকরেটার ব্যবহার করে একটি বাস্তবায়ন এখানে দেওয়া হয়েছে:
>>> def ifdef(plat):
... frame = sys._getframe().f_back
... def _ifdef(func):
... return _ifdef_decorator_impl(plat, func, frame)
... return _ifdef
...
>>> @ifdef('Darwin')
... def ice9():
... print("nonsense")
প্যারামিটারাইজড সজ্জাকরণগুলি সাদৃশ্যপূর্ণ foo = mydecorator(param)(foo)
।
আমি উত্তরটি বেশ কিছুটা আপডেট করেছি। মন্তব্যের প্রতিক্রিয়া হিসাবে, আমি শ্রেণি পদ্ধতিতে অ্যাপ্লিকেশন অন্তর্ভুক্ত করতে এবং অন্যান্য মডিউলগুলিতে সংজ্ঞায়িত ফাংশনগুলি আচ্ছাদন করার জন্য এর আসল সুযোগটি প্রসারিত করেছি। এই শেষ আপডেটে, আমি কোনও কার্য ইতিমধ্যে সংজ্ঞায়িত করা হয়েছে কিনা তা নির্ধারণের সাথে জড়িত জটিলতা ব্যাপকভাবে হ্রাস করতে সক্ষম হয়েছি।
[এখানে একটি সামান্য আপডেট ... আমি কেবল এটি নিচে রাখতে পারিনি - এটি একটি মজাদার অনুশীলন] আমি এর আরও কিছু পরীক্ষা করে যাচ্ছি এবং দেখেছি এটি সাধারণভাবে কলযোগ্যগুলিতে কাজ করে - কেবল সাধারণ ফাংশন নয়; আপনি কলযোগ্য কিনা তা শ্রেণিবিন্যাসকেও সাজাতে পারেন। এবং এটি ফাংশনগুলির অভ্যন্তরীণ ফাংশনকে সমর্থন করে, সুতরাং এর মতো জিনিসগুলি সম্ভব (সম্ভবত ভাল শৈলী নয় - এটি কেবল পরীক্ষার কোড):
>>> @macos
... class CallableClass:
...
... @macos
... def __call__(self):
... print("CallableClass.__call__() invoked.")
...
... @macos
... def func_with_inner(self):
... print("Defining inner function.")
...
... @macos
... def inner():
... print("Inner function defined for Darwin called.")
...
... @windows
... def inner():
... print("Inner function for Windows called.")
...
... inner()
...
... @macos
... class InnerClass:
...
... @macos
... def inner_class_function(self):
... print("Called inner_class_function() Mac.")
...
... @windows
... def inner_class_function(self):
... print("Called inner_class_function() for windows.")
উপরের অংশটি সজ্জকারের মৌলিক প্রক্রিয়া, কীভাবে কলারের সুযোগ অ্যাক্সেস করতে পারে এবং সাধারণ অ্যালগরিদম সংজ্ঞায়িত একটি অভ্যন্তরীণ ফাংশন রাখার মাধ্যমে একই ধরণের আচরণকারী একাধিক সাজসজ্জারকে কীভাবে সরলীকরণ করা যায় তা প্রদর্শন করে।
চেইন সাপোর্ট
কোনও ফাংশন একাধিক প্ল্যাটফর্মের জন্য প্রযোজ্য কিনা তা নির্দেশ করে এই সাজসজ্জা শৃঙ্খলাবদ্ধদের সমর্থন করার জন্য, সাজসজ্জাটি এভাবে প্রয়োগ করা যেতে পারে:
>>> class IfDefDecoratorPlaceholder:
... def __init__(self, func):
... self.__name__ = func.__name__
... self._func = func
...
... def __call__(self, *args, **kwargs):
... raise NotImplementedError(
... f"Function {self._func.__name__} is not defined for "
... f"platform {platform.system()}.")
...
>>> def _ifdef_decorator_impl(plat, func, frame):
... if platform.system() == plat:
... if type(func) == IfDefDecoratorPlaceholder:
... func = func._func
... frame.f_locals[func.__name__] = func
... return func
... elif func.__name__ in frame.f_locals:
... return frame.f_locals[func.__name__]
... elif type(func) == IfDefDecoratorPlaceholder:
... return func
... else:
... return IfDefDecoratorPlaceholder(func)
...
>>> def linux(func):
... return _ifdef_decorator_impl('Linux', func, sys._getframe().f_back)
এইভাবে আপনি শৃঙ্খলা সমর্থন করেন:
>>> @macos
... @linux
... def foo():
... print("works!")
...
>>> foo()
works!
my_callback = windows(<actual function definition>)
- তাই নামmy_callback
হবে প্রসাধক কি হতে পারে কি নির্বিশেষে মুছে ফেলা হতে। ফাংশনের লিনাক্স সংস্করণটি সেই পরিবর্তনশীলটিতে শেষ হওয়ার একমাত্র উপায় যদিwindows()
এটি ফিরে আসে তবে ফাংশনটির লিনাক্স সংস্করণ সম্পর্কে জানার উপায় নেই। আমি মনে করি এটি সম্পাদন করার আরও সাধারণ উপায় হ'ল পৃথক ফাইলগুলিতে ওএস-নির্দিষ্ট ফাংশন সংজ্ঞা রাখা এবং শর্তসাপেক্ষেimport
কেবল তার মধ্যে একটি।