পাইথনে শৃঙ্খলিত পদ্ধতিগুলির একটি লাইন কীভাবে ভাঙ্গবেন?


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
আমার মতে ডাবল ইন্ডেন্টেশনটি এখানে দরকারী কারণ এটি একটি সাধারণ ইনডেন্টড ব্লক থেকে দৃশ্যত পৃথক। অন্যান্য কোড দ্বারা ঘিরে থাকলে এটি আরও স্পষ্ট করে তোলে যে এটি একটি মোড়ানো একক লাইন line
stt

1
প্যারেন্স ব্যবহারের ক্ষেত্রে সেরা উত্তর। শানিমালের অন্য উত্তরে একটি মন্তব্যে যেমন উল্লেখ করা হয়েছে, প্রথম বন্ধনীগুলির মাধ্যমে সূচিত লাইন ধারাবাহিকতা ব্যবহার করা আসলে ধারাবাহিকতা চরিত্রের তুলনায় পিইপি 8 পছন্দসই ``
কেভলারের

আমি ব্যাকস্ল্যাশ পছন্দ করি। প্যারেনথেসিস সমস্ত পরিস্থিতিতে ইঙ্গিত নয়। উদাহরণস্বরূপ, এটি অ্যাসাইনমেন্ট অপারেটরের সাথে কাজ করে না। : কল্পনা করুন আপনি এই চেন লাইন ভঙ্গ করতে চান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 এবং এই বিশেষ ক্ষেত্রে শিকলযুক্ত ফিল্টারগুলি সারিবদ্ধ করা। এই পরিস্থিতিটি জ্যাঙ্গোতেও উত্থিত হয়েছে এবং এইভাবে সর্বাধিক পঠনযোগ্য - তবে অন্য কোনও পরিস্থিতিতে আমি অনুভূত বাক্যাংশগুলি উচ্চতর বলে মনে করি ("আমার ব্যাকস্ল্যাশের পরে কি" হোয়াইটস্পেস নেই? "ভুগবেন না)। এই বলেছিল যে বাক্যাংশটি বন্ধনীরূপে একই প্রভাব অর্জন করতে ব্যবহার করা যেতে পারে - তবে এটি আপনাকে পাইথন পড়ার মাঝামাঝি সময়ে লিস্প রিডিং মোডে রাখে, যা আমি ব্যাহত মনে করি।
zxq9

11
"সমাধানের পদ্ধতি যেমন দীর্ঘ হয় এবং পদ্ধতিগুলি" বাহ্যিক পেরেনগুলিতে মোড়ক "বা" প্রতিটি উন্মুক্ত পেরেনের পরে এবং প্রতিটি ঘনিষ্ঠ পেরেনের আগে "লাইন-ব্রেকের চেয়ে" সমাধানগুলি শুরু করার সাথে সাথে "এই সমাধানটি কীভাবে আরও ভালভাবে মোকাবেলা করতে সক্ষম তা আমি দেখতে পাই না I সমাধান। আসলে এটি হ্যান্ডেল করার ক্ষেত্রে এটি আরও খারাপ, যেহেতু (কমপক্ষে এখানে প্রদর্শিত হিসাবে) প্রতিটি ঝুলন্ত লাইনের জন্য এটি আরও গভীর ইনডেন্টের প্রয়োজন।
কার্ল মায়ার

1
ফিল্টার কলগুলির জন্য খুব বেশি ইনডেন্ট। একটি ট্যাব বা 4 স্পেস এখানে যথেষ্ট ছিল। এছাড়াও `` এর প্রান্তিককরণ ... আপনি কত স্পেস কীটি ধরে রেখেছিলেন? সাধারণত আমি সমস্ত উপায়ের বিপক্ষে, যার জন্য আপনাকে যে স্পেস কীটি হাতুড়ি করা দরকার যেমন কাল নেই।
জেলফির কালটসটহল

2
fwiw, PEP8 পড়ে "লম্বা লাইন মোড়ানোর পছন্দের উপায়টি হল বন্ধনী, বন্ধনী এবং ধনুর্বন্ধনীগুলির মধ্যে পাইথনের উল্লিখিত লাইন ধারাবাহিকতা ব্যবহার করা parent লম্ব লাইনগুলি বন্ধনীগুলিতে এক্সপ্রেশনকে মোড়ানো দ্বারা একাধিক লাইনের উপর ভেঙে ফেলা যায় These এগুলি ব্যাকস্ল্যাশ ব্যবহারের পছন্দ হিসাবে ব্যবহার করা উচিত লাইন ধারাবাহিকতার জন্য। " - পাইথন.আর.এস. যখন ব্যাকস্ল্যাশগুলি উপযুক্ত হতে পারে তা নিয়ে আলোচনা
চলছে

পিইপি 8-তে দুর্দান্ত রেফারেন্স! সব সমতলতা সঙ্গে এখানে একটি বিরক্তিকর সমস্যা .filterকল যদি আপনি পরিবর্তন করে subkeywordথেকে sub_keyword, আপনি এখন এর খাঁজ ঠিক করতে প্রতি একক লাইন ঠিক কারণ আপনার পরিবর্তনশীল নাম পরিবর্তন করেছেন। স্টাইল আসলে রক্ষণাবেক্ষণে বাধা দেয় তখন ভাল হয় না ...
কেভ্যালার

15

আমার ব্যক্তিগত পছন্দটি হ'ল:

সাবকিওয়ার্ড = সেশন.কিউরি (
    Subkeyword.subkeyword_id,
    Subkeyword.subkeyword_word,
).দ্বারা ফিল্টার করুন(
    subkeyword_company_id = self.e_company_id,
    subkeyword_word = subkeyword_word,
    subkeyword_active = true,
).এক()

1
বেশ কয়েকটি পরামিতি যদি পাস করা হয় তবে আমি সম্মত হন তবে 0 বা 1 পরামিতিগুলি সাধারণ হয়ে গেলে এটি কুশ্রী দেখায়। উদাহরণস্বরূপ: gist.github.com/andybak/b23b6ad9a68c7e1b794d
অ্যান্ডি বেকার

1
হ্যাঁ, এই স্টাইলে কিছু অবক্ষয়জনক কেস রয়েছে (যে কোনও স্টাইলের মতো)। আমি সমস্ত খোলা প্যারেনগুলি ভাঙবো না। এর কোনওটিই
pkoch

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
@ টেলরএডমিস্টন অবশ্যই আংশিক ফলাফলের জন্য আপনার আলাদা আলাদা নাম থাকতে পারে। ভালো কিছু 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.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()

এসকিউএএলএলএকচেমি ফিল্টার_বাই () ইঙ্গিতের জন্য +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)
আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.