के साथ functools.wraps का उपयोग करके मैं एक साधारण सजावट लिखने की कोशिश कर रहा हूं जो सजाए गए फ़ंक्शन को कॉल करने से पहले दिए गए कथन को लॉग करता है। लॉग बयान दोनों एक ही समारोह से आते हैं, जो मैंने सोचा था functools.wraps() का उद्देश्य था।लॉगिंग सजावट
क्यों निम्नलिखित कोड है: की तरह लॉग बयान में
import logging
logging.basicConfig(
level=logging.DEBUG,
format='%(funcName)20s - %(message)s')
from functools import wraps
def log_and_call(statement):
def decorator(func):
@wraps(func)
def wrapper(*args, **kwargs):
logging.info(statement)
return func(*args, **kwargs)
return wrapper
return decorator
@log_and_call("This should be logged by 'decorated_function'")
def decorated_function():
logging.info('I ran')
decorated_function()
परिणाम:
wrapper - This should be logged by 'decorated_function'
decorated_function - I ran
मैंने सोचा था कि wraps के लिए कॉल decorated_function के नाम के साथ आवरण का नाम बदलने होगा।
मैं अजगर 2.7.1 का उपयोग कर रहा हूं।
क्या हर समय वक्तव्य पास किए बिना ऐसा करने का कोई तरीका है। का मतलब है कि मैं सिर्फ अपने कोड में logger.info ('test {}', 123) का उपयोग करना चाहता हूं लेकिन यह स्वचालित रूप से एक अतिरिक्त निर्देश जोड़ता है। अब मैं आपके विचार का उपयोग करता हूं। def log_and_call (कथन, स्तर) की तरह: .... और डीफ़ टेस्ट (सेंट, स्तर): @ log_and_call() def api(): api() पास करें। और logger.debug ('test {}' प्रारूप (123), 'डीबग' जैसे उपयोग करें)। इसका काम कोई बेहतर तरीका है। – Jisson