2009-05-03 6 views
19

मैं छोटे पायथन फ़ंक्शन को छोटे में पुन: सक्रिय करना चाहता हूं। उदाहरण के लिए, इस कोड स्निपेट पर विचार करें:पायथन: बहुत से तर्कों के बारे में पिलिंट चेतावनियों से परहेज करना

x = x1 + x2 + x3 + x4 + x5 + x6 + x7 + x8 + x9 

बेशक, यह एक मामूली उदाहरण है। अभ्यास में, कोड अधिक जटिल है।

def mysum(x1, x2, x3, x4, x5, x6, x7, x8, x9): 
    x = x1 + x2 + x3 + x4 + x5 + x6 + x7 + x8 + x9 
    return x 

समस्या यह है कि pylint भी कई तर्क बारे में एक चेतावनी ट्रिगर करेगा है: मेरा मुद्दा यह है कि यह कई स्थानीय दायरे चर निकाले कार्य करने के लिए पारित किया जा करने के लिए होता है कि, जो दिखाई दे सकता है शामिल हैं। मैं की तरह कुछ कर रही द्वारा चेतावनी से बच सकते हैं:

def mysum(d): 
    x1 = d['x1'] 
    x2 = d['x2'] 
    ... 
    x9 = d['x9'] 
    x = x1 + x2 + x3 + x4 + x5 + x6 + x7 + x8 + x9 
    return x 

def mybigfunction(): 
    ... 
    d = {} 
    d['x1'] = x1 
    ... 
    d['x9'] = x9 
    x = mysum(d) 

लेकिन इस दृष्टिकोण मेरे लिए बदसूरत घरों में शौचालय, यह कोड का एक बहुत है कि अनावश्यक है लेखन की आवश्यकता है।

क्या ऐसा करने का कोई बेहतर तरीका है?

+1

मेरा मानना ​​है कि mysum() को सरलीकृत किया जा सकता है: 'वापसी राशि (d.values ​​())' या कम से कम 'वापसी राशि ([d [foo] foo (' x1 ',' x2 ', में foo के लिए .. ।, 'x 9')]) '। क्या मैं भी सूची-समझ खुश हूं? – MatrixFrog

+1

मैसूर() केवल एक अमूर्त है, वास्तविक परिदृश्यों में जिस कोड को निकालने की आवश्यकता है वह अधिक जटिल है। मेरा मुद्दा निकाले गए फ़ंक्शन में कई चर पारित करने और संभव होने पर पिलिंट चेतावनी से बचने के बारे में है (स्पष्ट रूप से उस चेतावनी को अनदेखा करने के लिए पिलिंट बनाने के बिना)। – Anonymous

उत्तर

5

फ़ंक्शन को सरल या विभाजित करें ताकि उसे नौ तर्कों की आवश्यकता न हो (या पिलिंट को अनदेखा न करें, लेकिन जो लोग आप प्रस्तावित कर रहे हैं जैसे कि लिंट टूल के उद्देश्य को हराते हैं)।

संपादित करें: http://lists.logilab.org/pipermail/python-projects/2006-April/000664.html

बाद में, आप विकलांग चेतावनी के सभी के लिए grep कर सकते हैं: अगर यह एक अस्थायी उपाय है, के रूप में यहाँ वर्णित एक टिप्पणी का उपयोग कर प्रश्न में विशेष कार्य के लिए चेतावनी को अक्षम करें।

+0

मेरा लक्ष्य पहले बड़े कार्य को तोड़ना है। तब मैं छोटे भागों को तोड़ने के लिए आगे बढ़ सकता था। लेकिन अगर यह संभव है, तो मैं रिफैक्टरिंग प्रक्रिया के दौरान इस विशिष्ट पिलिंट चेतावनी से बचना चाहता हूं। – Anonymous

12

आप Python's variable arguments सुविधा का उपयोग कर की कोशिश कर सकते:

def myfunction(*args): 
    for x in args: 
     # Do stuff with specific argument here 
+1

यह एक सूची का उपयोग करने जैसा ही है, नीचे देखें। – Anonymous

6

शायद आप सदस्य चर में बहस के कुछ बदल सकता है। यदि आपको उस राज्य की आवश्यकता है तो एक वर्ग मुझे एक अच्छा विचार की तरह लगता है।

+0

काम नहीं करता है अगर मुझे कक्षा विधि को दोबारा करने की आवश्यकता है और पारित चर बड़े रिफैक्चरर्ड विधि के लिए स्थानीय हैं और पूरे वर्ग में उपयोग नहीं किए जाते हैं। – Anonymous

+3

नहीं, लेकिन यदि आप इसके बजाय एक नया प्रकार निकालते हैं तो आप कुछ राज्य को सदस्य चर में बदल सकते हैं। –

0

पायथन के कुछ अच्छे कार्यात्मक प्रोग्रामिंग टूल हैं जो आपकी आवश्यकताओं को अच्छी तरह फिट करने की संभावना रखते हैं। lambda functions और map देखें। साथ ही, जब आप ऐसा लगता है कि आप सूचियों के साथ बेहतर सेवा करेंगे तो आप डिक्ट्स का उपयोग कर रहे हैं। आपके द्वारा प्रदान किए गए सरल उदाहरण के लिए, इस मुहावरे को आजमाएं। ध्यान दें कि नक्शा बेहतर और तेज होगा, लेकिन अपनी आवश्यकताओं फिट नहीं हो सकता है:

def mysum(d): 
    s = 0 
    for x in d: 
     s += x 
    return s 

def mybigfunction(): 
    d = (x1, x2, x3, x4, x5, x6, x7, x8, x9) 
    return mysum(d) 

आप स्थानीय चर का एक बहुत होने का उल्लेख किया है, लेकिन स्पष्ट रूप से अगर आप सूचियों (या tuples) के साथ काम कर रहे हैं, आप सूचियों का उपयोग करना चाहिए और लंबे समय तक उन सभी स्थानीय चरों को कारक बनाएं।

+0

मैं एक सूची का उपयोग नहीं कर सकता। मेरे छोटे उदाहरण में मेरे पास किए गए चर समान भूमिका निभाते हैं। लेकिन एक जटिल परिदृश्य में चर के अलग-अलग अर्थ होते हैं, इसलिए इंडेक्स द्वारा एक्सेस किए गए सूची आइटमों के साथ उनके नामों को बदलना (जो तार्किक अर्थ लेते हैं) पूरी तरह से कोड की पठनीयता को नष्ट कर देगा। – Anonymous

+2

आपको तब ताना का उपयोग करना होगा। उस ने कहा, जब तक आप अपनी कुछ आवश्यकताओं को नहीं बदल लेते हैं, तब तक आप सामान को साफ करने में सक्षम नहीं होंगे। वैकल्पिक रूप से आप इन सभी चीजों के लिए कक्षा परिभाषित कर सकते हैं और फिर विभिन्न वर्ग विधियों में तर्क को धक्का दे सकते हैं। शायद एक बड़े पैमाने पर एक साफ-सुथरा पेड़ की तुलना में क्लीनर, कम से कम! – easel

55

पहले, Perlis's epigrams में से एक:

"आप 10 मानकों के साथ एक प्रक्रिया है, तो आप शायद कुछ याद किया।"

10 में से कुछ तर्क संभावित रूप से संबंधित हैं। उन्हें एक वस्तु में समूहित करें, और इसके बजाय इसे पास करें।

ऊपर एक उदाहरण बनाना, प्रश्न में पर्याप्त जानकारी सीधे जवाब देने के लिए नहीं है, क्योंकि वहाँ:

class PersonInfo(object): 
    def __init__(self, name, age, iq): 
    self.name = name 
    self.age = age 
    self.iq = iq 

फिर अपने 10 तर्क समारोह:

def f(x1, x2, name, x3, iq, x4, age, x5, x6, x7): 
    ... 

हो जाता है:

def f(personinfo, x1, x2, x3, x4, x5, x6, x7): 
    ... 

और कॉलर में परिवर्तन:

personinfo = PersonInfo(name, age, iq) 
result = f(personinfo, x1, x2, x3, x4, x5, x6, x7) 
+3

मुझे यह जवाब पसंद है क्योंकि यह बताता है कि समस्या के बारे में कैसे सोचें! –

24

क्या आप तर्कों को पारित करने के लिए एक बेहतर तरीका चाहते हैं या pylint को कठिन समय देने से रोकने का एक तरीका चाहते हैं?

#pylint: disable-msg=R0913 

या:

#pylint: disable-msg=too-many-arguments 

उन्हें वापस चालू करने के लिए याद बाद, मैं की तर्ज पर अपने कोड में pylint -controlling टिप्पणियां डाल कर याद करने के लिए है कि आप सता रोक सकता है लगता है जितनी जल्दी संभव हो।

मेरी राय में, वहाँ कुछ भी नहीं स्वाभाविक तर्क और समाधान कुछ कंटेनर बहस में उन सब को ऊपर लपेटकर वास्तव में किसी भी समस्याओं, आप :-) सता से pylint रोक के अलावा अन्य का समाधान नहीं है की वकालत की एक बहुत कुछ गुजर साथ कुछ गड़बड़ है।

यदि आपको बीस तर्क पारित करने की आवश्यकता है, तो उन्हें पास करें। ऐसा हो सकता है कि यह आवश्यक है क्योंकि आपका कार्य बहुत अधिक कर रहा है और फिर से फैक्टरिंग वहां सहायता कर सकती है, और यह कुछ ऐसा है जिसे आपको देखना चाहिए। लेकिन यह कोई निर्णय नहीं है हम वास्तव में तब तक बना सकते हैं जब तक कि हम देखते हैं कि 'असली' कोड क्या है।

+3

इस उत्तर वास्तव में बुरी आदतों को प्रोत्साहित करती है - 2015 1) उनकी संख्या के साथ चेकों को निष्क्रिय करने में अब पढ़ने - प्रतीकात्मक वर्णनकर्ता, और अधिक अर्थप्रकाशक आधुनिक pylint संस्करणों का समर्थन 2) कुछ अक्षम करने भी की एक विवरण के साथ एक टिप्पणी होनी चाहिए इसका कारण यह है कि इसे 3) प्रति पंक्ति केवल एक ही निर्देश होना चाहिए, जो 4) आमतौर पर पिलिंट का एक बिंदु है। कोड जो उन सीमाओं के साथ संघर्ष करता है शायद असंभव/असंभव है। 5) पैरामीटर की बहुलता को पार करने के बजाय, एक शब्दकोश या नामित टुपल का उपयोग करना बेहतर है। –

+3

इगोर, यही कारण है कि मैंने "लाइनों के साथ" कहा। हर तरह से संख्यात्मक, या एक पंक्ति के बजाय प्रतीकों का उपयोग करें, या टिप्पणी क्यों करें, या फिर से सक्षम करें (हालांकि आपको यह समझना चाहिए कि इसका अर्थ क्या है यदि इसे पहले अक्षम किया गया था - बेहतर/सहेजने/अक्षम/पुनर्स्थापित करने का तरीका होगा)।इनमें से कोई भी उत्तर की उपयोगिता को स्वयं नहीं बदलता है, जो किसी समस्या के बारे में चेतावनी रोकने के लिए पिलिंट को बताना है कि उपयोगकर्ता _knows_ के बारे में सुनना नहीं चाहता (और परिणामों को स्वीकार करता है)। – paxdiablo

+2

उपयोगकर्ता संभवतः स्वयं विरोधाभास में होता है: पिलिंट उस अर्थ में सबसे स्पष्ट उपकरण नहीं है, लेकिन आमतौर पर दी गई चेतावनियों को संदेश की तुलना में कहीं अधिक गहरी पहुंच होती है। तो उपयोगकर्ता यह सोचने के लिए * सोच सकता है कि कौन से परिणाम स्वीकार किए जाते हैं, लेकिन वह प्रभावों की पूरी तरह से सराहना नहीं करता है। –

14

आप आसानी से पिलिंट में अधिकतम स्वीकृत संख्याओं को बदल सकते हैं।

अधिकतम-आर्ग = 5

लिए: बस अपने pylintrc फ़ाइल (यह उत्पन्न करता है, तो आप पहले से ही एक नहीं है) और परिवर्तन को खोलने

अधिकतम-आर्ग = 6 # या कि किसी भी मूल्य सूट आप

pylint के manual

निर्दिष्ट सभी उपयुक्त अपने स्थापना के लिए विकल्प और कोडिंग मानकों हो सकता से टेडि ous, तो डिफ़ॉल्ट मान निर्दिष्ट करने के लिए एक आरसी फ़ाइल का उपयोग करना संभव है। पिलिंट/etc/pylintrc और ~/.pylintrc के लिए दिखता है। Thegenerate-rcfile विकल्प कॉन्फ़िगरेशन फ़ाइल मानक आउटपुट और बाहर निकलने पर वर्तमान कॉन्फ़िगरेशन के अनुसार एक टिप्पणी उत्पन्न करेगा। आप विकल्पों को कॉन्फ़िगरेशन में उपयोग करने से पहले या डिफ़ॉल्ट मानों के साथ शुरू करने से पहले कॉन्फ़िगरेशन को ट्यून कर सकते हैं।

3

paxdiablo के प्रत्युत्तर के बारे टिप्पणी - के रूप में मैं वहाँ सीधे टिप्पणी करने के लिए पर्याप्त प्रतिष्ठा नहीं है: -/

मैं संख्या की चर्चा करते हुए पसंद नहीं है, sybolic नाम और अधिक अर्थपूर्ण है और जोड़ने के लिए होने से बचने एक टिप्पणी जो समय के साथ अप्रचलित हो सकती है।

तो मैं नहीं बल्कि करना चाहते हैं:

#pylint: disable-msg=too-many-arguments 

और मैं भी वहाँ झूलते इसे छोड़ नहीं करने की सिफारिश करेंगे: जब तक फ़ाइल समाप्त हो जाती है या वह अक्षम है, जो भी पहले हो यह सक्रिय रहेंगे।

तो बेहतर कर रहा:

#pylint: disable-msg=too-many-arguments 
code_which_would_trigger_the_msg 
#pylint: enable-msg=too-many-arguments  

मैं भी सक्षम/एक ही चेतावनी/प्रति पंक्ति त्रुटि को अक्षम करने की सिफारिश करेंगे।