2012-12-22 24 views
12

मैं एक विधि के साथ एक अजगर वर्ग जब बुला जो तर्क और कीवर्ड तर्क इस तरहअजगर समारोह * args और अन्य निर्दिष्ट कीवर्ड तर्क

class plot: 
    def __init__(self, x, y): 
     self.x = x 
     self.y = y 

    def set_axis(self, *args, xlabel="x", ylabel="y", **kwargs): 
     for arg in args: 
      <do something> 
     for key in kwargs: 
      <do somethng else> 

को स्वीकार करना चाहिए के साथ ** kwargs:

plt = plot(x, y) 
plt.set_axis("test1", "test2", xlabel="new_x", my_kwarg="test3") 

मैं

01 की तरह मेरे पद्धति सेट करता है, तो वैसे भी TypeError: set_axis() got multiple values for keyword argument 'xlabel'

: मैं त्रुटि मिलती है

और कॉल:

plt = plot(x, y) 
plt.set_axis(xlabel="new_x", "test1", "test2", my_kwarg="test3") 

मैं SyntaxError: non-keyword arg after keyword arg मिलता है, के रूप में मैं उम्मीद कर रहा था। पहले मामले में क्या गलत है? डिफॉल्ट वाले के अलावा, किसी भी उपयोगकर्ता तर्क और कीवर्ड तर्क को स्वीकार करने के लिए मुझे अपनी विधि कैसे बताई जानी चाहिए? (आशा है कि मेरे सवाल का काफी स्पष्ट है)

+2

पाइथन का कौन सा संस्करण आप उपयोग कर रहे हैं? आपके द्वारा सूचीबद्ध प्रथम श्रेणी पायथन 2.7.3 में पार्स नहीं करती है क्योंकि 'set_axis' परिभाषा में पैरामीटर नाम से '* args' सफल होता है। – phant0m

उत्तर

14

आप एक अलग तरीके का प्रयोग करेंगे:

def set_axis(self, *args, **kwargs): 
    xlabel = kwargs.get('xlabel', 'x') 
    ylabel = kwargs.get('ylabel', 'y') 

यह वापस आने मान रखते हुए यदि कीवर्ड तर्क परिभाषित नहीं कर रहे हैं आप उपयोग करना * और ** अनुमति देता है।

+0

कैसे? इसे या तो kwargs में परिभाषित किया गया है और यह इसके मान को पढ़ता है, या यह फॉलबैक 'एक्स' का उपयोग करता है। –

+4

क्या यह इसे पूरा करने का एकमात्र तरीका है? मुझे लगता है कि आपको * तर्कों और नामांकित तर्कों को मिश्रण करने के लिए ** kwargs में सभी कीवर्ड तर्कों को वापस करने की आवश्यकता नहीं है – eipxen

14

अजगर 3 में इस काम करता है: kwargs अगर वर्तमान से

def set_axis(self, *args, **kwargs): 
    xlabel = kwargs.pop('xlabel', 'x') 
    ylabel = kwargs.pop('ylabel', 'y') 

मैं pop को get बदल xlabel दूर करने के लिए और ylabel:

Python 3.2.3 (default, Oct 19 2012, 19:53:16) 
>>> def set_axis(self, *args, xlabel="x", ylabel="y", **kwargs): 
...  print(args, xlabel, ylabel, kwargs) 
... 
>>> set_axis(None, "test1", "test2", xlabel="new_x", my_kwarg="test3") 
('test1', 'test2') new_x y {'my_kwarg': 'test3'} 
>>> 
+0

मैं पाइथन 2.7 – fmonegaglia

+4

का उपयोग कर रहा हूं यह पायथन 2.7 में काम नहीं करता है। – Phob

2

यहाँ जुरे सी के जवाब देने के लिए एक मामूली Tweek है । मैंने ऐसा इसलिए किया क्योंकि मूल प्रश्न में शेष कोड में एक लूप होता है जिसका उपयोग के माध्यम सेxlabel और ylabel को छोड़कर करने के लिए किया जाता है।