2012-08-02 11 views
5

दरअसल शीर्षक वास्तव में उस प्रश्न को प्रतिबिंबित नहीं करता है जिसे मैं पूछना चाहता हूं। मेरा उद्देश्य इस तरह है: मैं matplotlib का उपयोग करके कुछ साजिश कार्यों को लिख रहा हूं। मेरे पास कई योजनाएं हैं जो अलग-अलग साजिश के उद्देश्य के लिए हैं।स्वचालित रूप से फ़ंक्शन तर्क डिफ़ॉल्ट मान को प्रतिस्थापित करने के लिए पायथन सजावट का उपयोग करें?

if axes==None: 
     fig=plt.figure() 
     axes=fig.add_subplot(111) 
    else: 
     pass 
:

import matplotlib.pyplot as plt 
def line_plot(axes=None,x=None,y=None): 
    if axes==None: 
     fig=plt.figure() 
     axes=fig.add_subplot(111) 
    else: 
     pass 
    axes.plot(x,y) 

def bar_plot(axes=None,x=None,y=None): 
    if axes==None: 
     fig=plt.figure() 
     axes=fig.add_subplot(111) 
    else: 
     pass 
    axes.bar(left=x,height=y) 

फिर भी समस्या प्रत्येक समारोह है कि निर्धारित किया है के लिए, है, मैं कोड के इस हिस्से को दोहराना: बार आदि उदाहरण के लिए के लिए line_plot() लाइनों के लिए, bar_plot() की तरह

क्या एक सजावट का उपयोग करके ऐसा कोई तरीका है, जिसे मैं प्लॉटिंग फ़ंक्शन की परिभाषा से पहले लागू कर सकता हूं, जो स्वचालित रूप से कोड का बार-बार भाग करेगा? इस प्रकार मुझे हर बार उन्हें दोहराना नहीं है। तो उदाहरण तरह होगा

def check_axes(axes): 
    if axes==None: 
     fig=plt.figure() 
     axes=fig.add_subplot(111) 
     return axes 
    else: 
     return axes 

:

एक संभावित विकल्प इस तरह एक समारोह को परिभाषित करने के लिए है

import matplotlib.pyplot as plt  
def line_plot(axes=None,x=None,y=None): 
    axes=check_axes(axes) 
    axes.plot(x,y) 

def bar_plot(axes=None,x=None,y=None): 
    axes=check_axes(axes) 
    axes.bar(left=x,height=y) 

लेकिन वहाँ एक बेहतर/साफ/अधिक pythonic तरीका है? मुझे लगता है कि मैं एक सजावट का उपयोग कर सकता हूं लेकिन इसे समझ नहीं पाया। क्या कोई कुछ विचार दे सकता है?

धन्यवाद !!

import matplotlib.pyplot as plt  

def check_axes(plot_fn): 
    def _check_axes_wrapped_plot_fn(axes=None, x=None, y=None): 
     if not axes: 
      fig = plt.figure() 
      axes = fig.add_subplot(111) 
      return plot_fn(axes, x, y) 
     else: 
      return plot_fn(axes, x, y) 
    return _check_axes_wrapped_plot_fn 

@check_axes 
def line_plot(axes, x=None, y=None): 
    axes.plot(x, y) 

@check_axes 
def bar_plot(axes, x=None, y=None): 
    axes.bar(left=x, height=y) 

कैसे काम करता है: @check_axes वाक्य रचना सजाया समारोह, उदा के नाम को पुनर्परिभाषित

+2

मुझे लगता है कि आपका अंतिम समाधान बहुत अच्छा है। कार्य कोड बनाने के लिए कुशल, सिद्ध तरीके हैं। मुझे संदेह है कि एक सजावटी अनावश्यक रूप से चीजों को जटिल करेगा। –

+0

हो सकता है कि आप अपने परीक्षण के साथ अपने अक्ष के साथ एक अक्ष वर्ग बना सकते हैं – zenpoy

उत्तर

7

यहाँ कैसे एक डेकोरेटर के साथ यह करने के लिए है line_plot सजावट द्वारा बनाई गई एक नई फ़ंक्शन होने के लिए, यानी _check_axes_wrapped_plot_fn। यह "लपेटा हुआ" फ़ंक्शन axes-चेकिंग तर्क को संभालता है और फिर मूल साजिश फ़ंक्शन को कॉल करता है।

आप check_axes चाहते हैं किसी भी भूखंड समारोह है कि सिर्फ उन है कि यह भी केवल x और y तर्क ले अपनी पहली तर्क के रूप में एक axes लेता है, नहीं सजाने के लिए सक्षम होने के लिए, आप मनमाने ढंग से तर्क सूचियों के लिए अजगर का काम * सिंटैक्स का उपयोग कर सकते हैं:

def check_axes(plot_fn): 
    def _check_axes_wrapped_plot_fn(axes=None, *args): 
     if not axes: 
      fig = plt.figure() 
      axes = fig.add_subplot(111) 
      return plot_fn(axes, *args) # pass all args after axes 
     else: 
      return plot_fn(axes, *args) # pass all args after axes 
    return _check_axes_wrapped_plot_fn 

अब, इनमें से कोई भी "बेहतर/क्लीनर/अधिक पायथनिक" शायद बहस का विषय है, और बड़े संदर्भ पर निर्भर करता है।

वैसे, "अधिक पायथनिक" होने की भावना में, मैंने आपके कोड को PEP8 शैली मार्गदर्शिका के करीब होने के लिए दोबारा सुधार दिया। पैरामीटर सूचियों में अल्पविरामों के बाद रिक्त स्थान पर ध्यान दें, = असाइनमेंट ऑपरेटर के आसपास की जगहें (लेकिन जब = फ़ंक्शन कीवर्ड पैरामीटर के लिए उपयोग की जाती है), और के बजाय not axes कह रही है।

+1

हाय उत्तर Ghopper21 आपके उत्तर के लिए। मैं यही देखना चाहता हूं। हां, चाहे वह अधिक पाइथोनिक को बड़ी तस्वीर को ध्यान में रखना चाहिए। कोड के सुधारण के लिए भी धन्यवाद, और सुधारित एक बेहतर दिखता है :) – wiswit

संबंधित मुद्दे