पायथन में जंजीर विधियों की एक पंक्ति को कैसे तोड़ना है?


138

मेरे पास निम्न कोड की एक पंक्ति है (कन्वेंशनों के नामकरण के लिए दोष न दें, वे मेरे नहीं हैं):

subkeyword = Session.query(
    Subkeyword.subkeyword_id, Subkeyword.subkeyword_word
).filter_by(
    subkeyword_company_id=self.e_company_id
).filter_by(
    subkeyword_word=subkeyword_word
).filter_by(
    subkeyword_active=True
).one()

मुझे यह पसंद नहीं है कि यह कैसा दिखता है (बहुत पठनीय नहीं है) लेकिन मेरे पास इस स्थिति में 79 वर्णों तक लाइनों को सीमित करने का कोई बेहतर विचार नहीं है। क्या इसे तोड़ने का एक बेहतर तरीका है (अधिमानतः बिना बैकस्लैश के)?

जवाबों:


256

आप अतिरिक्त कोष्ठक का उपयोग कर सकते हैं:

subkeyword = (
        Session.query(Subkeyword.subkeyword_id, Subkeyword.subkeyword_word)
        .filter_by(subkeyword_company_id=self.e_company_id)
        .filter_by(subkeyword_word=subkeyword_word)
        .filter_by(subkeyword_active=True)
        .one()
    )

मुझे भी यह सबसे अच्छा लगता है। अधिक कोड नहीं जोड़ता है और यह बैकस्लैश के बिना है।
जूलियस गोंजा

22
सुनिश्चित नहीं हैं कि यहां अतिरिक्त इंडेंटेशन का क्या औचित्य है; मुझे लगता है कि यह समाधान सिर्फ एक बार इंडेंट किए गए लटके लाइनों के साथ-साथ अनुगामी परन को बिल्कुल भी नहीं पढ़ता है।
कार्ल मेयर

4
मेरी राय में डबल इंडेंटेशन यहां उपयोगी है क्योंकि यह सामान्य इंडेंटेड ब्लॉक से दृष्टिगत रूप से अलग है। जब अन्य कोड से घिरा होता है, तो यह अधिक स्पष्ट होता है कि यह एक लिपटे सिंगल लाइन है।
sth

1
सबसे अच्छा जवाब, parens का उपयोग करने के मामले में। के रूप में एक और उत्तर में Shanimal द्वारा एक टिप्पणी में उल्लेख किया है, कोष्ठकों के माध्यम से गर्भित लाइन निरंतरता का उपयोग कर वास्तव में है पीईपी 8 वरीय बनाम निरंतरता चरित्र ``
kevlarr

मैं बैकस्लैश पसंद करता हूं। कोष्ठक सभी स्थिति के लिए एक संकेत नहीं है। एक उदाहरण के रूप में, यह असाइनमेंट ऑपरेटर के साथ काम नहीं करता है। कल्पना कीजिए कि आप इस श्रृंखला में लाइनें तोड़ना चाहते हैं:foo.set_default('bar', {}).set_default('spam', {}).set_default('eggs', {})['lol'] = 'yeah'
loutre

56

यह एक ऐसा मामला है जहां एक पंक्ति निरंतरता चरित्र को कोष्ठक खोलने के लिए पसंद किया जाता है। इस शैली की आवश्यकता और अधिक स्पष्ट हो जाती है क्योंकि विधि के नाम अधिक लंबे हो जाते हैं और जैसे-जैसे तरीके तर्क लेना शुरू करते हैं:

subkeyword = Session.query(Subkeyword.subkeyword_id, Subkeyword.subkeyword_word) \
                    .filter_by(subkeyword_company_id=self.e_company_id)          \
                    .filter_by(subkeyword_word=subkeyword_word)                  \
                    .filter_by(subkeyword_active=True)                           \
                    .one()

पीईपी 8 को सामान्य ज्ञान और व्यावहारिक और सुंदर दोनों के लिए एक आंख के साथ व्याख्या करने का इरादा है। खुशी से किसी भी पीईपी 8 दिशानिर्देश का उल्लंघन होता है जिसके परिणामस्वरूप कोड पढ़ने के लिए बदसूरत या कठिन होता है।

कहा जा रहा है, अगर आप अक्सर खुद को पीईपी 8 के साथ बाधाओं पर पाते हैं, तो यह संकेत हो सकता है कि पठनीयता के मुद्दे हैं जो आपकी पसंद के व्हाट्सएप को पार करते हैं :-)


2
बैकस्लैश पर +1 और इस विशेष मामले में जंजीर फिल्टर को संरेखित करना। यह स्थिति Django में भी उत्पन्न होती है और इस तरह से सबसे अधिक पठनीय है - लेकिन किसी भी अन्य स्थिति में मुझे लगता है कि कोष्ठक वाक्यांशों से बेहतर हैं (मेरे बैकस्लैश के बाद "व्हाट्सएप से पीड़ित नहीं हैं?" समस्या)। उस ने कहा, वाक्यांश को छोटा करने का उपयोग उसी प्रभाव को प्राप्त करने के लिए किया जा सकता है - लेकिन यह आपको पायथन पढ़ने के बीच में लिस्प रीडिंग मोड में डालता है, जिसे मैं शब्दजाल लगता है।
zxq9

11
मैं यह नहीं देखता कि यह समाधान कैसे बेहतर हो सकता है "क्योंकि जैसे-जैसे विधि के नाम लंबे होते हैं, वैसे ही तर्क शुरू होते हैं" या तो "बाहरी परगनों में लपेटो" की तुलना में या प्रत्येक खुले पेरेन के बाद "लाइन-ब्रेक" और प्रत्येक करीबी पार्न से पहले " समाधान। वास्तव में यह संभालने में बदतर है, क्योंकि (कम से कम जैसा कि यहां दिखाया गया है) इसके लिए हर लटकी रेखा के लिए अधिक गहन इंडेंट की आवश्यकता होती है।
कार्ल मेयर

1
फ़िल्टर कॉल के लिए बहुत अधिक इंडेंट। एक टैब या 4 रिक्त स्थान यहाँ पर्याप्त होता। यह भी `` के संरेखण ... कितने सेकंड आप उस अंतरिक्ष कुंजी को दबाए रखा? आम तौर पर मैं सभी तरीकों के खिलाफ हूं, जिससे आपको उस अंतरिक्ष कुंजी को हथौड़ा करना पड़ता है जैसे कि कल नहीं है।
ज़ेल्फिर कलस्टहल 16

2
fwiw, PEP8 में लिखा है, "लंबी लाइनों को लपेटने का पसंदीदा तरीका कोष्ठक, कोष्ठक और ब्रेसिज़ के अंदर पायथन की निहित लाइन निरंतरता का उपयोग करना है। कोष्ठक में अभिव्यक्तियों को लपेटकर लंबी लाइनों को कई लाइनों पर तोड़ा जा सकता है। इनका उपयोग बैकस्लैश का उपयोग करने के लिए किया जाना चाहिए। लाइन निरंतरता के लिए। " - Python.org यह चर्चा करने के लिए जाता है कि बैकस्लैश कब उपयुक्त हो सकते हैं
शनीमल

PEP8 के लिए महान संदर्भ! सभी .filterकॉलों को संरेखित करने के साथ एक कष्टप्रद मुद्दा यह है कि यदि आप में परिवर्तन subkeywordकरते हैं sub_keyword, तो आपको अब हर एक पंक्ति के इंडेंटेशन को ठीक करना होगा क्योंकि आपने चर नाम बदल दिया है। अच्छा नहीं है जब शैली वास्तव में
स्थिरता

15

मेरी व्यक्तिगत पसंद होगी:

उपवाक्य = सत्र। प्रश्न (
    Subkeyword.subkeyword_id,
    Subkeyword.subkeyword_word,
)।के द्वारा छनित(
    subkeyword_company_id = self.e_company_id,
    subkeyword_word = subkeyword_word,
    subkeyword_active = सच,
)।एक()

1
मैं मानता हूँ कि वहाँ कई मापदंडों को पारित किया जा रहा है, लेकिन यह बदसूरत लग रहा है जब 0 या 1 पैरामीटर आम हैं। उदाहरण के लिए: gist.github.com/andybak/b23b6ad9a68c7e1b794d
एंडी बेकर

1
हाँ, उस शैली में पतित मामले हैं (किसी भी शैली की तरह)। मैं सभी खुले पारे को नहीं तोड़ूंगा। इसमें से कोई भी मुझे खुश नहीं करता है, लेकिन यहाँ कुछ मामले हैं: gist.github.com/pkoch/8098c76614765750f769
20

12

बस मध्यवर्ती परिणाम / वस्तु को स्टोर करें और उस पर अगली विधि लागू करें, जैसे

q = Session.query(Subkeyword.subkeyword_id, Subkeyword.subkeyword_word)
q = q.filter_by(subkeyword_company_id=self.e_company_id)
q = q.filter_by(subkeyword_word=subkeyword_word)
q = q.filter_by(subkeyword_active=True)
subkeyword = q.one()

10
यह एक क्वेरी की तरह कुछ के लिए अच्छी तरह से काम करता है लेकिन एक सामान्य पैटर्न के रूप में, मुझे यकीन नहीं है। उदाहरण के लिए, ब्यूटीफुल सूप की तरह, जब team_members = soup.find(class_='section team').find_all('ul').find_all('li')प्रत्येक .find(...)कॉल से वापसी मूल्य team_membersअभी तक फिट नहीं है।
टेलर एड्मिस्टन

1
@TaylorEdmiston पाठ्यक्रम के आंशिक परिणामों के लिए आपके अलग-अलग नाम हो सकते हैं। जैसे कुछ section = soup.find(class_='section team')और team_members = section.find_all('ul').find_all('li')
ज्येकोमन

4

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


4

यह दूसरों द्वारा प्रदान की तुलना में एक अलग समाधान का एक सा है, लेकिन मेरा एक पसंदीदा है क्योंकि यह कभी-कभी निफ्टी मेटाप्रोग्रामिंग की ओर जाता है।

base = [Subkeyword.subkeyword_id, Subkeyword_word]
search = {
    'subkeyword_company_id':self.e_company_id,
    'subkeyword_word':subkeyword_word,
    'subkeyword_active':True,
    }
subkeyword = Session.query(*base).filter_by(**search).one()

यह खोजों के निर्माण के लिए एक अच्छी तकनीक है। अपने जटिल क्वेरी फॉर्म (या उपयोगकर्ता क्या देख रहे हैं इसके बारे में स्ट्रिंग-आधारित कटौती) से खदानों की एक सूची के माध्यम से जाओ, फिर बस फिल्टर में शब्दकोश में विस्फोट करें।


1

आप SQLAlchemy का उपयोग कर रहे हैं, यदि यह सच है, तो sqlalchemy.orm.query.Query.filter_by()विधि कई कीवर्ड तर्क लेती है, इसलिए आप इस तरह लिख सकते हैं:

subkeyword = Session.query(Subkeyword.subkeyword_id,
                           Subkeyword.subkeyword_word) \
                    .filter_by(subkeyword_company_id=self.e_company_id,
                               subkeyword_word=subkeyword_word,
                               subkeyword_active=True) \
                    .one()

लेकिन यह बेहतर होगा:

subkeyword = Session.query(Subkeyword.subkeyword_id,
                           Subkeyword.subkeyword_word)
subkeyword = subkeyword.filter_by(subkeyword_company_id=self.e_company_id,
                                  subkeyword_word=subkeyword_word,
                                  subkeyword_active=True)
subkeuword = subkeyword.one()

SQLAlchemy filter_by () संकेत के लिए +1। यह इस उदाहरण के लिए अच्छा है, लेकिन मैं अक्सर फिल्टर () का उपयोग करता हूं जो केवल 1 शर्त को स्वीकार करता है।
जूलियस गोंजा

1

मुझे दो ब्लॉकों द्वारा तर्क और एक खंड द्वारा कथन को पसंद करना है, जैसे:

for image_pathname in image_directory.iterdir():
    image = cv2.imread(str(image_pathname))
    input_image = np.resize(
            image, (height, width, 3)
        ).transpose((2,0,1)).reshape(1, 3, height, width)
    net.forward_all(data=input_image)
    segmentation_index = net.blobs[
            'argmax'
        ].data.squeeze().transpose(1,2,0).astype(np.uint8)
    segmentation = np.empty(segmentation_index.shape, dtype=np.uint8)
    cv2.LUT(segmentation_index, label_colours, segmentation)
    prediction_pathname = prediction_directory / image_pathname.name
    cv2.imwrite(str(prediction_pathname), segmentation)
हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.