স্টাইলিং মাল্টি-লাইনের শর্তাবলী 'যদি' বিবৃতিতে? [বন্ধ]


675

কখনও কখনও আমি ifবেশ কয়েকটি লাইনে লম্বা শর্ত ভাঙ্গি। এটি করার সবচেয়ে সুস্পষ্ট উপায় হ'ল:

  if (cond1 == 'val1' and cond2 == 'val2' and
      cond3 == 'val3' and cond4 == 'val4'):
      do_something

দৃষ্টিভঙ্গি খুব খুব আবেদনকারী নয়, কারণ কর্মটি শর্তগুলির সাথে মিশে যায়। তবে 4 টি স্পেসের সঠিক পাইথন ইন্ডেন্টেশন ব্যবহার করা এটি প্রাকৃতিক উপায়।

এই মুহুর্তের জন্য আমি ব্যবহার করছি:

  if (    cond1 == 'val1' and cond2 == 'val2' and
          cond3 == 'val3' and cond4 == 'val4'):
      do_something

তবে এটি খুব সুন্দর নয়। :-)

আপনি বিকল্প উপায় সুপারিশ করতে পারেন?


2
আপনার সম্পাদক যদি পিইপি 8 লঙ্ঘনের বিষয়ে সতর্কতা অবলম্বন করতে সনাক্ত করতে পেপ 8 পাইথন প্যাকেজ ব্যবহার করে তবে আপনাকে হয় E125 ত্রুটি অক্ষম করতে হবে বা প্যাকেজের মানদণ্ডকে সন্তুষ্ট করে এমন একটি বিন্যাস সমাধান সমাধান করতে হবে । প্যাকেজ এর প্রথম সংখ্যাটি 126 কঠোরভাবে PEP8 বৈশিষ্ট অনুসরণ করতে প্যাকেজ স্থাপন সম্পর্কে। ইস্যুটির আলোচনার সাথে এখানে কিছু স্টাইলের পরামর্শও অন্তর্ভুক্ত রয়েছে। pep8pep8
আকাইহোলা

1
মনে রাখবেন যে প্রথম উদাহরণের জন্য, পেপ 8 "পরবর্তী পরবর্তী লজিকাল লাইনের মতো একই ইনডেন্টের সাথে E129 ভিজ্যুয়াল ইন্টেন্টেড লাইন" ফেলে দেবে।
টেলর এডমিস্টন

এই প্রশ্নটি অনেক পুরানো এবং এর একটি সংখ্যক মতামত রয়েছে তবে এটি দ্ব্যর্থহীন মতামত ভিত্তিক। ভাষা "খুব আবেদনময়ী নয়" এবং "খুব সুন্দর নয়" এমন মানদণ্ডটি নির্ধারণ করে যা অনুমিতভাবে সঠিক উত্তরটিই প্রশ্নকারীদের নান্দনিক পছন্দকে (যেমন একটি মতামত) সবচেয়ে ভালভাবে সাজায়। আমি ঠিক একই প্রশ্নটি জিজ্ঞাসা করতে পারি এবং দাবি করতে পারি যে এটি কোনও সদৃশ নয় কারণ আমার নান্দনিক স্বাদ এটিকে আলাদা হিসাবে যোগ্য করে তোলে এবং একটি ভিন্ন "ডান" উত্তরের দিকে পরিচালিত করে।
জেড 4-টায়ার

@ জেড 4-স্তর: হ্যাঁ, এটি মতামত ভিত্তিক। তবে এটি 12 বছর আগে জিজ্ঞাসা করা হয়েছিল। এসও তত্ক্ষণাত্ পৃথক, দয়ালু জায়গা ছিল । এসও এর স্ট্যান্ডার্ডগুলি পরিবর্তিত হওয়ার পরে এটি নিম্নবর্গগুলি জমে উঠেছে। তবুও, 1 মিলিয়ন বার দেখা হয়ে গেলে, আমি আশা করি এটি বিশ্বের ক্ষতির চেয়ে আরও ভাল কাজ করছে। আমি অবশ্যই লোকেরা আজ একই প্রশ্নটি সম্পর্কে ভেবে অবাক হতে দেখছি, এটি গুগল করে, এই আলোচনায় অবতীর্ণ হয়েছে এবং তাদের চিন্তাভাবনাটি ক্যালিব্রেট করার জন্য এটি দরকারী বলে মনে হচ্ছে। নির্বাচনের জন্য বেশ কয়েকটি ভোটাভুটি উত্তর রয়েছে।
এলি বেন্ডারস্কি

@ এলিবেেন্ডারস্কি সম্পূর্ণরূপে একমত। এটি যেমন এসও-র একটি চলমান পরিচয় সংকট রয়েছে: যদিও এটি "বিধি" পরিষ্কারভাবে ফিট করে না (বৈধ উত্তরের সংখ্যা এটির একটি টেস্টামেন্ট), এটি ঠিক এটি স্পষ্ট যে এটি মান যুক্ত করে। সমস্ত জিনিস সমান হওয়ায় আমি বরং এমন কারও সাথে কাজ করব যা কোডিং শৈলীতে মনোজ্ঞ এবং যুক্তিযুক্ত দৃষ্টিভঙ্গি গড়ে তুলেছিল, এমনকি যদি তাদের মতামত আমার থেকে পৃথক হয়।
Z4- স্তর

উত্তর:


748

আপনার দ্বিতীয় শর্তাধীন লাইনে আপনাকে 4 টি স্পেস ব্যবহার করার দরকার নেই। হতে পারে ব্যবহার:

if (cond1 == 'val1' and cond2 == 'val2' and 
       cond3 == 'val3' and cond4 == 'val4'):
    do_something

এছাড়াও, হোয়াইটস্পেসটি আপনার ভাবার তুলনায় আরও নমনীয়:

if (   
       cond1 == 'val1' and cond2 == 'val2' and 
       cond3 == 'val3' and cond4 == 'val4'
   ):
    do_something
if    (cond1 == 'val1' and cond2 == 'val2' and 
       cond3 == 'val3' and cond4 == 'val4'):
    do_something

উভয়ই যদিও মোটামুটি কুৎসিত।

সম্ভবত বন্ধনীগুলি হারাবেন ( স্টাইল গাইড যদিও এটিকে নিরুৎসাহিত করে)?

if cond1 == 'val1' and cond2 == 'val2' and \
   cond3 == 'val3' and cond4 == 'val4':
    do_something

এটি কমপক্ষে আপনাকে কিছু পার্থক্য দেয়।

অথবা এমনকি:

if cond1 == 'val1' and cond2 == 'val2' and \
                       cond3 == 'val3' and \
                       cond4 == 'val4':
    do_something

আমি মনে করি আমি পছন্দ করি:

if cond1 == 'val1' and \
   cond2 == 'val2' and \
   cond3 == 'val3' and \
   cond4 == 'val4':
    do_something

এখানে স্টাইল গাইড রয়েছে , যা (২০১০ সাল থেকে) বন্ধনী ব্যবহারের পরামর্শ দেয়।


45
নোট করুন যে পিছনের \ সমাধানগুলি পিইপি 8 দ্বারা সুপারিশ করা হয় না One একটি কারণ হ'ল যদি কোনও জায়গার পরে ভুল করে যুক্ত করা হয় \ এটি আপনার সম্পাদকে নাও দেখাতে পারে এবং কোডটি সিনট্যাকটিকভাবে ভুল হয়ে যায়।
এরিক হে লেবিগোট

14
এটি ভুল, শৈলী নির্দেশিকা বলেছে যে "বন্ধনীগুলিতে এক্সপ্রেশনকে মোড়ানো দ্বারা একাধিক লাইনের উপর দীর্ঘ লাইনগুলি ভেঙে ফেলা যায় These লাইন ধারাবাহিকতার জন্য ব্যাকস্ল্যাশ ব্যবহার করার পক্ষে এগুলি ব্যবহার করা উচিত" " আপনি এটি এখানে দেখতে পাবেন: পাইথন.আর
দেবদেবী

8
PEP পরিবর্তন @joshcartme hg.python.org/peps/rev/7a48207aaab6 স্পষ্টভাবে ব্যাকস্ল্যাশ নিরুৎসাহিত করতে। আমি উত্তর আপডেট করব।
হারলে হলকম্বি

3
ধন্যবাদ, আপনার উদাহরণগুলি এখনই সুপারিশ করা না হওয়ায় সম্ভবত এটি আপডেট করাও ভাল ধারণা। আমি নিজেই এটি বের করার চেষ্টা করছিলাম এবং আপনার উত্তর এবং শৈলীর গাইডের (তাই আমার মন্তব্য) মধ্যে পার্থক্য দেখে বিভ্রান্ত হয়ে পড়েছিলাম। আমি কেবল পেডেন্টিক হওয়ার চেষ্টা করিনি।
জোশকার্টমে

3
পিইপি 8 এখন andএবং পরেও ব্রেকিংকে নিরুৎসাহিত করে if
ভার্চুয়ালসিটিসি

124

অবনতির ক্ষেত্রে আমি নিম্নলিখিতগুলি অবলম্বন করেছি যেখানে এটি সহজ এবং এর বা OR এর OR

if all( [cond1 == 'val1', cond2 == 'val2', cond3 == 'val3', cond4 == 'val4'] ):

if any( [cond1 == 'val1', cond2 == 'val2', cond3 == 'val3', cond4 == 'val4'] ):

এটি কয়েকটি অক্ষর শেভ করে এবং এটি পরিষ্কার করে দেয় যে শর্তটির কোনও সূক্ষ্মতা নেই।


4
এটি একটি আকর্ষণীয় পদ্ধতির। যদিও দীর্ঘ শর্তের ইস্যুটি
সম্বোধন করে না

20
আপনি শর্টকিউটিংয়ের বিষয়ে চিন্তা না করলে এটি ঠিক আছে।
কনস্টান্টিন

63
শর্টকার্টুইটিং সবসময় দ্রুত সম্পর্কে হয় না। ভাল অভ্যাস কোডিং না হলেও, আপনি যদি বিদ্যমান ভালো কোড আছে করতে পারেন: if destroy_world and DestroyTheWorld() == world_is_destroyed: ...। দুর্দান্ত, এখন আপনি দুর্ঘটনায় সবেমাত্র বিশ্ব ধ্বংস করেছেন। তুমি কীভাবে?
হারুন

4
আমি অবাক হয়েছি যে এর এতগুলি উত্সাহ রয়েছে। এই উত্তরটি মাল্টি-লাইন শর্তাবলীর স্টাইলিং সম্পর্কে মূল প্রশ্নটিকে সম্পূর্ণ উপেক্ষা করে ।
প্রজেমেক ডি

2
এই অভিব্যক্তি অলস নয়। সুতরাং কোনও রক্ষণশীল শর্তটি সম্ভবত একটি ব্যর্থতার পরে অনুসরণ করা সমান নয়।
ইউজিন-উজ্জ্বল

56

কারও কারও এখানে উল্লম্ব সাদা স্থান ব্যবহার করতে হবে! :)

if (     cond1 == val1
     and cond2 == val2
     and cond3 == val3
   ):
    do_stuff()

এটি প্রতিটি শর্ত পরিষ্কারভাবে দৃশ্যমান করে তোলে। এটি আরও জটিল অবস্থার পরিচ্ছন্ন প্রকাশের অনুমতি দেয়:

if (    cond1 == val1
     or 
        (     cond2_1 == val2_1
          and cond2_2 >= val2_2
          and cond2_3 != bad2_3
        )
   ):
    do_more_stuff()

হ্যাঁ, আমরা স্বচ্ছতার জন্য কিছুটা উল্লম্ব রিয়েল এস্টেট ব্যবসা করছি। ভাল মূল্য এটি আইএমও।


19
এটি সুন্দর বা পিইপি 8-সামঞ্জস্যপূর্ণ বলে মনে হচ্ছে না। পিইপি 8 বলছে যে বাইনারি অপারেটর (যেমন andপাশাপাশি পাশাপাশি or) ভাঙ্গার জন্য পছন্দের জায়গাটি অপারেটরের পরে , তার আগে নয়।
ক্রিস মেড্রেলা

7
ক্রিস্টোফারমেদ্রেলা কি এর পিছনে যুক্তি বলে? আমি মনে করি লজিক অপারেটরের আগে একটি লাইন বিরতি রাখা অনেক বেশি পরিষ্কার
নরিল টেম্পেস্ট

4
নোডের জগতে প্রথমে অপেরেটর স্থাপন করা সাধারণ। যুক্তিটি হ'ল আমরা বামদিকে স্টাফগুলি ডানদিকে স্টাফের চেয়ে অনেক দ্রুত - লক্ষ্য করি এবং পড়ি - কমপক্ষে পশ্চিমা সংস্কৃতিতে। জাভাস্ক্রিপ্টে খুব কার্যকর, যেখানে একটি ভুলে যাওয়া কমা নীরব ত্রুটি ঘটাতে পারে।
টমেকভি

11
দয়া করে এটি করবেন না। কেবল এটিই নয় PEP8তবে আপনি যে লজিক অপারেশনটির সাথে শৃঙ্খলা করছেন তা নির্ধারণ করা আরও শক্ত করে তোলে। কোড পর্যালোচনার মাধ্যমে যদি এটি আমার ডেস্কে আসে তবে আমি এটিকে ঘাবড়ে দেব।
উর্দা

11
পিইপি 8 এর বর্তমান সংস্করণ হিসাবে, বাইনারি অপারেটরের আগে বা পরে ব্রেকিংকে গ্রহণযোগ্য বলে মনে করা হয় , এবং অপারেটরটিকে নতুন কোডের জন্য আরও ভাল বিবেচনা করার আগে।
সোরেন জর্নস্ট্যাড

31

আমি যদি এই শৈলীটি পছন্দ করি তবে আমার শর্তটি অত্যন্ত বড় থাকে:

if (
    expr1
    and (expr2 or expr3)
    and hasattr(thingy1, '__eq__')
    or status=="HappyTimes"
):
    do_stuff()
else:
    do_other_stuff()

2
ইনডেন্টগুলি রাখার জন্য +1 যেখানে আপনি তাদের ট্র্যাক রাখতে পারেন। আমি অজগর পছন্দ করি এবং এটি প্রচুর ব্যবহার করি তবে কেবল তাই বাধ্য হয়ে আমি নিয়মিত বিরক্ত হই। মাল্টি-লাইন যদি সত্যই নান্দনিককে ধ্বংস করে, এমনকি ভাল কাজ করা সত্ত্বেও।
পয়লাপাইল

4
নোট করুন যে লাইনের শুরুতে আপনার andএবং orঅপারেটরগুলি থাকা পিইপি 0008 লঙ্ঘন করে , যা বলে যে "বাইনারি অপারেটরের চারপাশে ভাঙ্গার পছন্দসই জায়গা অপারেটরের পরে, তার আগে নয়" " । শরীরের থেকে অবস্থার পৃথকীকরণের জন্য আমি তাদের নিজস্ব লাইনে বন্ধনী বন্ধনী এবং কোলন রাখা পছন্দ করি, যদিও (এবং পিইপি-0008 সম্মতি জন্য আপনার বুলিয়ান অপারেটরদের লাইনের শেষে রাখার সময় এটি করা পুরোপুরি সম্ভব)।
এমেরি

8
২০১ of সালের হিসাবে: For decades the recommended style was to break after binary operators. But this can hurt readability in two ways... In Python code, it is permissible to break before or after a binary operator, as long as the convention is consistent locally. For new code Knuth's style is suggested.(নুথের স্টাইলটি অপারেটরের সাথে লাইন শুরু করবে)।
কাওবার্ট

27

এখানে আমার খুব ব্যক্তিগত গ্রহণযোগ্যতা রয়েছে: দীর্ঘ শর্তাদি (আমার দৃষ্টিতে) একটি কোড গন্ধ যা বুলিয়ান-ফেরত ফাংশন / পদ্ধতিতে রিফ্যাক্টরিংয়ের পরামর্শ দেয়। উদাহরণ স্বরূপ:

def is_action__required(...):
    return (cond1 == 'val1' and cond2 == 'val2'
            and cond3 == 'val3' and cond4 == 'val4')

এখন, যদি আমি বহু-লাইনের শর্তগুলি দেখতে সুন্দর করার উপায় খুঁজে পেয়েছি তবে আমি সম্ভবত সেগুলি নিয়ে নিজেকে সন্তুষ্ট করব এবং রিফ্যাক্টরিংটি এড়িয়ে যাব।

অন্যদিকে, তাদের আমার নান্দনিক জ্ঞানকে ঘৃণা করা রিফ্যাক্টরিংয়ের উত্সাহ হিসাবে কাজ করে।

আমার উপসংহার, অতএব, একাধিক লাইনের শর্তগুলি কুৎসিত হওয়া উচিত এবং এগুলি এড়াতে এটি একটি উত্সাহ।


23

এটি এত উন্নতি করে না তবে ...

allCondsAreOK = (cond1 == 'val1' and cond2 == 'val2' and
                 cond3 == 'val3' and cond4 == 'val4')

if allCondsAreOK:
   do_something

1
আকর্ষণীয় বিকল্প। তবে 2 টি অতিরিক্ত লাইন :-)
এলি বেন্ডারস্কি

একটি পুনরাবৃত্ত লুপে সত্যিই এটি খুব ভালভাবে কাজ করতে চান না, কিছু করার সাথে ফাংশনগুলি নিয়ে কাজ করবেন না ... এবং ন্যায্য - কুৎসিত
মেজ

9
ব্রায়ান, আমি আংশিকভাবে একমত নই। গণনার মধ্যবর্তী ফলাফলের জন্য ভেরিয়েবলগুলি ব্যবহার করা কোড বোঝা সহজ করে তুলতে পারে এবং সংকলিত ভাষায় কোনও কার্যকারিতা প্রভাব ফেলবে না। এটি সম্ভবত অজগরকে করতে পারে, যদিও পারফোলেন্সটি যদি গুরুত্বপূর্ণ হত তবে আমি अज্যর ব্যবহার করতাম না।
মার্ক বাকের

1
@ মারকবেকার আপনি যা লিখেছেন তাতে আমি একমত হয়েছি, যতক্ষণ না আমি মার্টিন ফওলারগুলি "রিফ্যাক্টরিং" না পড়ি। তিনি একটি দুর্দান্ত যুক্তি সরবরাহ করেন যে এই ধরনের মধ্যবর্তী পরিবর্তনগুলি সুবিধার চেয়ে বেশি ক্ষতি করে। তারা পরবর্তী রিফ্যাক্টরিংয়ে বাধা দেয়। এগুলি না করে আরও কার্যকরী প্রোগ্রামিং শৈলীর দিকে পরিচালিত করে, যা নিজেকে রিফ্যাক্টরিংয়ে ভাল ধার দেয়। এটি আমাকে বিস্মিত করেছে, তবে আমি বিশ্বাস করি যে তিনি সঠিক, এবং তারপর থেকে আমার কোড থেকে এই জাতীয় অযথা মধ্যস্থতাকে অপসারণ করার চেষ্টা করেছেন - এমনকি যদি সেগুলি একাধিকবার ব্যবহৃত হয়।
জোনাথন হার্টলি

2
ভাল, তবে উটকেস কেন ?! :)
লিওনিড শ্বেচিকভ

19

আমি andকীওয়ার্ডটি দ্বিতীয় লাইনে নিয়ে যাওয়া এবং চারটি পরিবর্তে দুটি স্পেস সহ শর্তাবলীযুক্ত সমস্ত লাইন যুক্ত করার পরামর্শ দিচ্ছি :

if (cond1 == 'val1' and cond2 == 'val2'
  and cond3 == 'val3' and cond4 == 'val4'):
    do_something

ঠিক এইভাবেই আমি আমার কোডটিতে এই সমস্যাটি সমাধান করি। লাইনে প্রথম শব্দ হিসাবে একটি কীওয়ার্ড থাকা শর্তটিকে অনেক বেশি পঠনযোগ্য করে তোলে এবং স্পেসের সংখ্যা হ্রাস করে শর্তটিকে ক্রিয়া থেকে পৃথক করে।


9
আমি গ্রিস বা জিক্স্ট্রা যে কোনও জায়গায় পড়েছি যে লজিক অপারেটরটিকে লাইনের সামনের দিকে রেখে - আরও দৃশ্যমান করা - সহায়তা করেছে। এবং আমি 90 এর দশক থেকে এটি করে আসছি। এবং এটি সাহায্য করে।
এস .লট

7
নোট করুন যে স্টাইল গাইডটি লাইনের শেষে শর্তযুক্ত রাখার পরামর্শ দেয়।
হারলে হলকম্ব

3
এটি সত্য, যদিও আমি এর সাথে এর সাথে কখনও একমত হইনি। সর্বোপরি এটি কেবল গাইড।
ডিজিনএক্স

8
পিইপি 8 আর লাইনের শেষে শর্তসাপেক্ষ রাখার পরামর্শ দেয় না
সোরেন জর্নস্ট্যাড

14

এটি পিইপি 0008 (পাইথনের অফিশিয়াল স্টাইল গাইড) উদ্ধৃত করার মতো বলে মনে হচ্ছে , যেহেতু এটি সামান্য দৈর্ঘ্যে এই বিষয়ে মন্তব্য করেছে:

যখন কোনও ifস্টেটমেন্টের শর্তাধীন অংশটি একাধিক লাইন জুড়ে রচনার জন্য যথেষ্ট দীর্ঘ হয়, তবে এটি লক্ষণীয় যে দুটি অক্ষরের কীওয়ার্ড (অর্থাত্ if) এর সাথে একটি একক স্থান, এবং একটি খোলার প্রথম বন্ধনী একটি প্রাকৃতিক 4- তৈরি করে শর্তাধীন মাল্টলাইন পরবর্তী লাইনগুলির জন্য স্পেস ইনডেন্ট। এটি স্টেটমেন্টের অভ্যন্তরে নেস্টেড কোডের ইন্টেন্টেড স্যুটটির সাথে একটি ভিজ্যুয়াল দ্বন্দ্ব তৈরি করতে পারে ifযা স্বাভাবিকভাবে 4 স্পেসে ইন্টেন্টেড থাকে। এই পিইপি কীভাবে (বা কিনা) ifস্টেস্টমেন্টের অভ্যন্তরের নেস্টেড স্যুট থেকে এই ধরনের শর্তসাপেক্ষ রেখাগুলি আরও দৃশ্যমানভাবে আলাদা করতে পারে তার কোনও স্পষ্ট অবস্থান নেয় না । এই পরিস্থিতিতে গ্রহণযোগ্য বিকল্পগুলির মধ্যে অন্তর্ভুক্ত রয়েছে তবে সীমাবদ্ধ নয়:

# No extra indentation.
if (this_is_one_thing and
    that_is_another_thing):
    do_something()

# Add a comment, which will provide some distinction in editors
# supporting syntax highlighting.
if (this_is_one_thing and
    that_is_another_thing):
    # Since both conditions are true, we can frobnicate.
    do_something()

# Add some extra indentation on the conditional continuation line.
if (this_is_one_thing
        and that_is_another_thing):
    do_something()

উপরের উদ্ধৃতিতে "সীমাবদ্ধ নয়" নোট করুন; স্টাইল গাইডে প্রস্তাবিত পদ্ধতির পাশাপাশি, এই প্রশ্নের অন্যান্য উত্তরে যেগুলি প্রস্তাবিত হয়েছে তাদের কিছু গ্রহণযোগ্যও are


PEP8 এর জন্য +1। এটি অবশ্যই গ্রহণযোগ্য হওয়া উচিত , যেহেতু এটি (ব্যবহারিকভাবে বলতে) অফিসিয়াল পাইথন স্টাইল গাইড is
মাইকেল - ক্লে শিরকি

2
এটিও জোর দিয়ে বলার অপেক্ষা রাখে না যে, পিইপি 8 স্পষ্টভাবে তার অবস্থান সম্পর্কে জানিয়েছে যে এই পিইপি কীভাবে (বা কিনা) যদি স্টেস্টমেন্টের অভ্যন্তরে নেস্টেড স্যুট থেকে এই ধরনের শর্তাধীন রেখাগুলি আরও দৃish়ভাবে আলাদা করতে পারে সে সম্পর্কে কোনও স্পষ্ট অবস্থান নেয় না। এই পরিস্থিতিতে গ্রহণযোগ্য বিকল্পগুলির মধ্যে অন্তর্ভুক্ত রয়েছে তবে এতে সীমাবদ্ধ নয়: ... (ছিটিয়ে) সুতরাং, তর্ক করা বন্ধ করুন, নিজের পছন্দ মতো কিছু নিয়ে যান!
রায়লুও

7

এখানে আমি যা করি তা এখানে মনে রাখবেন যে "সমস্ত" এবং "যে কোনও" একটি পুনরাবৃত্তিযোগ্য গ্রহণ করে, তাই আমি কেবল একটি তালিকায় একটি দীর্ঘ শর্ত রেখেছি এবং "সকলকে" কাজটি করতে দেব।

condition = [cond1 == 'val1', cond2 == 'val2', cond3 == 'val3', cond4 == 'val4']

if all(condition):
   do_something

4

আমি আমার পছন্দসই সমাধানটি না দেখে অবাক হয়েছি,

if (cond1 == 'val1' and cond2 == 'val2'
    and cond3 == 'val3' and cond4 == 'val4'):
    do_something

যেহেতু andএকটি কীওয়ার্ড তাই এটি আমার সম্পাদক দ্বারা হাইলাইট হয়ে যায় এবং এটি নীচের do_soming থেকে সম্পূর্ণ আলাদা দেখায়।


তবে ধারাবাহিকতা রেখাটি পরবর্তী লজিকাল লাইন থেকে এখনও নিজেকে আলাদা করে না ...
ক্রিস মেড্রেলা

1
মনে রাখবেন এটি একটি পিইপি 0008 লঙ্ঘন ( "বাইনারি অপারেটরের চারপাশে ভাঙ্গার পছন্দসই জায়গা অপারেটরের পরে, তার আগে নয়" )। আপনি যত্ন নিচ্ছেন কিনা তা অবশ্যই আপনার উপর নির্ভর করে।
এমেরি

1
ঘটনাচক্রে, এটি আর আমার পছন্দসই সমাধান নয়। ;)
মারিয়াস গেডমিনাস

4

@ ক্রব্যোতি যা বলেছিলেন তাতে যুক্ত হচ্ছে ... দীর্ঘ অবস্থার গন্ধ আছে কারণ তারা পড়া কঠিন এবং বুঝতে অসুবিধা হয়েছে। একটি ফাংশন বা একটি ভেরিয়েবল ব্যবহার কোড পরিষ্কার করে তোলে। পাইথনে, আমি উল্লম্ব স্থান ব্যবহার করা, প্রথম বন্ধনী আবদ্ধ করতে এবং প্রতিটি লাইনের শুরুতে লজিকাল অপারেটরগুলি রাখতে পছন্দ করি যাতে অভিব্যক্তিগুলি "ভাসমান" এর মতো না দেখায়।

conditions_met = (
    cond1 == 'val1' 
    and cond2 == 'val2' 
    and cond3 == 'val3' 
    and cond4 == 'val4'
    )
if conditions_met:
    do_something

লুপগুলির মতো যদি শর্তগুলি একাধিকবার মূল্যায়ন করা দরকার whileতবে স্থানীয় ফাংশনটি ব্যবহার করা সবচেয়ে ভাল।


1
এটি ছাড়াও আপনি অতিরিক্ত ভেরিয়েবল তৈরির বিপরীতে আপনার সত্য মিথ্যা ফিরিয়ে দিতে কোনও ফাংশন বা ল্যাম্বডাকে ঘোষণা করতে পারেন।
টেকড্রাগন

@ টেকড্রাগন যদি শর্তগুলি অন্য কোথাও হয় তবে তাদের ল্যাম্বডা ব্লকের মধ্যে রাখার জন্য ল্যাম্বডা ব্লকের নামকরণ করা দরকার যাতে এটি পরে অবস্থাতেই উল্লেখ করা যেতে পারে। যদি কোনও ল্যাম্বডের নামকরণ করা যায় তবে কেন এটি এবং নিয়মিত কোনও কাজ নয়? আমি ব্যক্তিগতভাবে এই হ্রাস বুলিয়ান এক্সপ্রেশন পছন্দ করি।
শ্রী কাদিমিসেট্টি

আমি সম্মত, তাই প্রোগ্রাম নিয়ন্ত্রণ প্রবাহ বুঝতে স্কিমিংয়ের সময় আমি সাধারণত বেশিরভাগ ক্ষেত্রে উন্নত পাঠযোগ্যতা এবং মানসিক হজমের স্বাচ্ছন্দ্যের জন্য একটি ফাংশন ব্যবহার করব। লোকেরা বিশেষত স্থান সচেতন হলে 'ছোট' বিকল্পটি উপস্থিত রয়েছে তা নিশ্চিত করার জন্য আমি ল্যাম্বডাকে উল্লেখ করেছি।
টেকড্রাগন

4

ব্যক্তিগতভাবে, আমি দীর্ঘ যদি বিবৃতিতে অর্থ যুক্ত করতে চাই। একটি উপযুক্ত উদাহরণ খুঁজে পেতে আমাকে কোডের মাধ্যমে অনুসন্ধান করতে হবে, তবে এখানে প্রথম উদাহরণটি মনে আসে যা আসুন: আসুন আমি বলি যে আমি কিছু উদ্দীপনা যুক্তি নিয়ে চলেছি যেখানে আমি অনেকগুলি ভেরিয়েবলের উপর নির্ভর করে একটি নির্দিষ্ট পৃষ্ঠা প্রদর্শন করতে চাই।

ইংরাজী: "লগ-ইন করা ব্যবহারকারী যদি প্রশাসক শিক্ষক না হন তবে কেবল একজন নিয়মিত শিক্ষক এবং নিজেই ছাত্র না হন ..."

if not user.isAdmin() and user.isTeacher() and not user.isStudent():
    doSomething()

নিশ্চিত যে এটি দেখতে দুর্দান্ত হতে পারে তবে স্টেটমেন্টগুলি পড়া যদি খুব কাজ হয়। কীভাবে আমরা যুক্তিটিকে লেবেলটিতে অর্পণ করি যা বোঝা যায়। "লেবেল" আসলে পরিবর্তনশীল নাম:

displayTeacherPanel = not user.isAdmin() and user.isTeacher() and not user.isStudent()
if displayTeacherPanel:
    showTeacherPanel()

এটি নির্বোধ বলে মনে হতে পারে তবে আপনার আর একটি শর্ত থাকতে পারে যেখানে আপনি কেবলমাত্র অন্য আইটেমটি প্রদর্শন করতে চান তবে এবং যদি কেবলমাত্র আপনি শিক্ষক প্যানেলটি প্রদর্শন করছেন বা ব্যবহারকারী যদি ডিফল্টরূপে সেই নির্দিষ্ট নির্দিষ্ট প্যানেলে অ্যাক্সেস পেয়ে থাকেন:

if displayTeacherPanel or user.canSeeSpecialPanel():
    showSpecialPanel()

আপনার যুক্তি সংরক্ষণ এবং লেবেল করতে ভেরিয়েবলগুলি ব্যবহার না করে উপরের শর্তটি লেখার চেষ্টা করুন এবং কেবল আপনি খুব অগোছালো, কঠোর-পাঠযোগ্য লজিক্যাল স্টেটমেন্ট দিয়ে শেষ করবেন না, আপনি কেবল নিজের পুনরাবৃত্তি করেছেন। যুক্তিসঙ্গত ব্যতিক্রমগুলি থাকার সময়, মনে রাখবেন: নিজেকে পুনরাবৃত্তি করবেন না (ডিআরওয়াই)।


3

"সমস্ত" এবং "যে কোনও" একই ধরণের কেসের বিভিন্ন শর্তের জন্য দুর্দান্ত। তবে তারা সবসময় সমস্ত শর্তের মূল্যায়ন করে। যেমন এই উদাহরণে প্রদর্শিত:

def c1():
    print " Executed c1"
    return False
def c2():
    print " Executed c2"
    return False


print "simple and (aborts early!)"
if c1() and c2():
    pass

print

print "all (executes all :( )"
if all((c1(),c2())):
    pass

print

5
ত্রুটিপূর্ণ! তারা কেবল তাই করে কারণ আপনি করেন । [সি 1, সি 2] এফের জন্য সমস্ত (চ () (চেষ্টা করুন)।
হাবনবিত

2
আমি মনে করি তিনি কেবল উদাহরণ হিসাবে ফাংশনগুলি ব্যবহার করছিলেন কারণ তিনি সহজেই সেগুলি কিছু মুদ্রণ করতে পারেন। যদি আমরা ততক্ষণে একটি তালিকায় সরবরাহ করা একাধিক স্বতঃস্ফূর্ত ভাবের বিষয়টি বিবেচনা করছি all(), যদি না আপনি সেগুলি প্রত্যেককে একটি ল্যাম্বডায় মুড়ে রাখেন এবং আপনার f()কৌশলটি ব্যবহার না করেন তবে সেগুলি সমস্ত মূল্যায়ন করতে চলেছে। অন্য কথায়, অ্যারন: আমি মনে করি অ্যান্ডার্স সাধারণভাবে অবস্থার বিষয়ে কথা বলার চেষ্টা করেছিল, নির্দিষ্ট উদাহরণ হিসাবে কলযোগ্যকে ব্যবহার করে; তবে আপনার পুনরায় সংযোগ কেবলমাত্র ফাংশনগুলিতে প্রযোজ্য।
ব্র্যান্ডন রোডস

3

(আমি শনাক্তকারীদের হালকাভাবে সংশোধন করেছি যেহেতু স্থির-প্রস্থের নামগুলি বাস্তব কোডের প্রতিনিধিত্বকারী নয় - কমপক্ষে সত্যিকারের কোড নয় যা আমার মুখোমুখি হয় - এবং উদাহরণের পাঠযোগ্যতা বিশ্বাস করবে))

if (cond1 == "val1" and cond22 == "val2"
and cond333 == "val3" and cond4444 == "val4"):
    do_something

এটি "এবং" এবং "বা" (এটি দ্বিতীয় লাইনে প্রথম যে গুরুত্বপূর্ণ এটি গুরুত্বপূর্ণ) এর জন্য ভাল কাজ করে তবে অন্যান্য দীর্ঘ অবস্থার জন্য খুব কম। ভাগ্যক্রমে, পূর্ববর্তীটি আরও সাধারণ ক্ষেত্রে বলে মনে হয়, যদিও পরবর্তীকালে প্রায়শই অস্থায়ী পরিবর্তনশীল সহ সহজেই নতুন করে লেখা হয়। (এটি সাধারণত কঠিন নয়, তবে "এবং" / "বা" পুনর্লিখনের সময় সংক্ষিপ্তসার্কিট সংরক্ষণ করা কঠিন বা অনেক কম স্পষ্ট / পাঠযোগ্য হতে পারে))

যেহেতু আমি আপনার ব্লগ পোস্ট থেকে সি ++ সম্পর্কে এই প্রশ্নটি পেয়েছি , আমি আমার সি ++ স্টাইলটি একরকম অন্তর্ভুক্ত করব:

if (cond1 == "val1" and cond22 == "val2"
and cond333 == "val3" and cond4444 == "val4") {
    do_something
}

3

সরল এবং সাধারণ, পেপ 8 চেকগুলিও পাস করে:

if (
    cond1 and
    cond2
):
    print("Hello World!")

সাম্প্রতিক সময়ে আমি কাজগুলি allএবং anyফাংশনগুলিকে প্রাধান্য দিচ্ছি, যেহেতু আমি খুব কমই মিশ্রিত এবং এবং এবং এটি ভালভাবে মিলিয়ে তুলনা করি এবং জেনারেটর বোঝার সাথে প্রাথমিকভাবে ব্যর্থ হওয়ার অতিরিক্ত সুবিধা রয়েছে:

if all([
    cond1,
    cond2,
]):
    print("Hello World!")

শুধু একক পুনরাবৃত্ত মধ্যে পাস মনে রাখবেন! এন-আর্গুমেন্টে পাস করা সঠিক নয়।

দ্রষ্টব্য: anyঅনেক orতুলনা allমত, অনেক andতুলনা মত ।


এটি জেনারেটর বোঝার সাথে দুর্দান্তভাবে সম্মিলিত হয়, উদাহরণস্বরূপ:

# Check if every string in a list contains a substring:
my_list = [
    'a substring is like a string', 
    'another substring'
]

if all('substring' in item for item in my_list):
   print("Hello World!")

# or

if all(
    'substring' in item
    for item in my_list
):
    print("Hello World!")

আরও চালু: জেনারেটর বোধগম্যতা


1
আমার এটিও উল্লেখ করা উচিত যে পাইলটের স্টক কনফিগারেশন যদি একটি লাইনে ধারাবাহিকতায় ইন্ট্রা ইনডেন্ট চায়; যা আমাকে এই স্কিমটি ব্যবহার থেকে বিরত রেখেছে।
থারস্মমনার

2

যদি আমরা কন্ডিশন এবং শরীরের মধ্যে কেবল একটি অতিরিক্ত ফাঁকা রেখা সন্নিবেশ করি এবং বাকীটি ক্যানোনিকাল উপায়ে করি?

if (cond1 == 'val1' and cond2 == 'val2' and
    cond3 == 'val3' and cond4 == 'val4'):

    do_something

PS আমি সর্বদা ফাঁকা নয়, ট্যাব ব্যবহার করি; আমি সুন্দর সুর করতে পারি না ...


3
এটি খুব বিভ্রান্তিকর হবে, বিশেষত যখন শর্তাধীন শরীর দীর্ঘ হয়, আমার মনে হয়।
এলি বেন্ডারস্কি

আমি এলির সাথে একমত, এখানে এনক্যাপসুলেশন এবং ইন্ডেন্টেশন দীর্ঘ লাইনের জন্য বিভ্রান্তিকর। তদুপরি, নতুন নিয়মটি হ'ল andএবং orবিবৃতিগুলি পরের লাইনে শুরু করা উচিত
ভার্চুয়ালটিস্টক

2

আমি সাধারণত যা করি তা হ'ল:

if (cond1 == 'val1' and cond2 == 'val2' and
    cond3 == 'val3' and cond4 == 'val4'
   ):
    do_something

এইভাবে বন্ধ বন্ধনী এবং কোলন দৃশ্যমানভাবে আমাদের অবস্থার শেষ চিহ্নিত করে।


1
প্রায় সঠিক; পিইপি 8 এখন andবা এর আগে ব্রেক করার পরামর্শ দেয় or
ভার্চুয়ালসিটিসি

2

সমস্ত উত্তরদাতারা যদি এই বিবৃতিটির জন্য মাল্টি শর্তাদি সরবরাহ করে তবে সমস্যাটি যেমন উপস্থাপিত হয়েছে ততই কুৎসিত। আপনি একই জিনিস করে এই সমস্যাটির সমাধান করবেন না ..

এমনকি পিইপি 0008 উত্তরটি বিদ্বেষজনক।

এখানে আরও অনেক বেশি পঠনযোগ্য পদ্ধতি রয়েছে

condition = random.randint(0, 100) # to demonstrate
anti_conditions = [42, 67, 12]
if condition not in anti_conditions:
    pass

আমার কথা খেতে চাই? আমাকে বিশ্বাস করুন আপনার বহু-শর্তাবলীর প্রয়োজন এবং আমি আক্ষরিকভাবে এটি মুদ্রণ করব এবং আপনার বিনোদনের জন্য এটি খাব।


এটি প্রকৃতপক্ষে বহু-শর্তসাপেক্ষ করার একটি খুব সুন্দর উপায় :) জানেন না কেন এটির বেশি ভোট নেই :), কোনও সতর্কতা আছে কি?
dim_user

@ সলক্রুজ সত্যিই সেখানে শর্ত পরিবর্তনশীল কেবল প্রতিটি মান পরীক্ষা করার বিভিন্ন ডুপ্লিকেট সংরক্ষণ করার প্রয়োজন নেই, এটি কেবলমাত্র একটি মানকে একটি অ্যারে রাখে এবং ইঞ্জিনটি এটি (অনুকূলিত) কাজ করতে দেয় আপনার জন্য শর্তটি পরীক্ষা করা
স্টফ

@ স্টফ আমার মন্তব্য সরানোর জন্য আপনাকে ধন্যবাদ। আমি এটি উল্লেখ করতে চেয়েছিলাম যে আপনার দৃষ্টিভঙ্গি ওপি-র প্রশ্নের উত্তর দেয় না। আপনার দেওয়া কোডটি প্রশ্নের কোডটিতে প্রয়োগ করা যাবে না। যদি আপনি অন্যথায় মনে করেন তবে আপনার পয়েন্টটি প্রমাণ করার জন্য আপনার নিজের পদ্ধতির দ্বারা পুনরায় ফর্মিত ওপি কোড যুক্ত করা উচিত।
জাইকোমন

এটি গৃহীত উত্তর নয় তবে এটি স্পষ্টতই একটি বিকল্প পন্থা (অন্যরা সম্মত)। তাই বিকল্প উত্তর উত্সাহিত তাই যুক্তি ঠিক কি? আপনার নিজের প্রশ্নে পরিষ্কার থাকুন, আপনার যদি সঠিক মনোযোগের প্রয়োজন হয় তবে সম্ভবত আপনার নিজের প্রশ্ন খোলার বিষয়ে বিবেচনা করুন। পিএস আমি কোনও এসও মোড নই, আমি মন্তব্যগুলি সরাতে পারি না
স্টফ

2

আমি মনে করি @ জকান্দার সমাধানটি একটি ছোটখাটো মোচড় দিয়ে ভাল হবে। যদি আপনার নিজস্ব শর্তাদি এবং স্ব স্ব তালিকায় আপনার মান থাকে তবে আপনি তুলনাটি করতে তালিকা বোধগম্যতা ব্যবহার করতে পারেন যা শর্ত / মান জোড়া যুক্ত করার জন্য জিনিসগুলিকে কিছুটা সাধারণ করে তুলবে।

conditions = [1, 2, 3, 4]
values = [1, 2, 3, 4]
if all([c==v for c, v in zip(conditions, values)]):
    # do something

যদি আমি এই জাতীয় বিবৃতিটি হার্ড-কোড করতে চাই না, তবে আমি সুস্পষ্টতার জন্য এটি এইভাবে লিখতাম:

if (condition1==value1) and (condition2==value2) and \
   (condition3==value3) and (condition4==value4):

এবং কেবল iandঅপারেটর দিয়ে অন্য সমাধানটি ফেলে দিতে :

proceed = True
for c, v in zip(conditions, values):
    proceed &= c==v

if proceed:
    # do something

1
শুধু মজার জন্য: all(map(eq, have, expected))। (সহ from operator import eq)
গ্যাব্রিয়েল গার্সিয়া

1

সম্পূর্ণতার জন্য অন্য কয়েকটি এলোমেলো ধারণা। যদি তারা আপনার পক্ষে কাজ করে তবে সেগুলি ব্যবহার করুন। অন্যথায়, আপনি সম্ভবত অন্য কিছু চেষ্টা করে ভাল।

আপনি অভিধানের সাহায্যে এটি করতে পারেন:

>>> x = {'cond1' : 'val1', 'cond2' : 'val2'}
>>> y = {'cond1' : 'val1', 'cond2' : 'val2'}
>>> x == y
True

এই বিকল্পটি আরও জটিল, তবে আপনি এটি কার্যকরও দেখতে পাবেন:

class Klass(object):
    def __init__(self, some_vars):
        #initialize conditions here
    def __nonzero__(self):
        return (self.cond1 == 'val1' and self.cond2 == 'val2' and
                self.cond3 == 'val3' and self.cond4 == 'val4')

foo = Klass()
if foo:
    print "foo is true!"
else:
    print "foo is false!"

ডুনো যদি এটি আপনার পক্ষে কাজ করে তবে এটি বিবেচনার জন্য অন্য একটি বিকল্প। এখানে আরও একটি উপায় রয়েছে:

class Klass(object):
    def __init__(self):
        #initialize conditions here
    def __eq__(self):
        return (self.cond1 == 'val1' and self.cond2 == 'val2' and
               self.cond3 == 'val3' and self.cond4 == 'val4')

x = Klass(some_values)
y = Klass(some_other_values)
if x == y:
    print 'x == y'
else:
    print 'x!=y'

শেষ দুটি আমি পরীক্ষা করে দেখিনি, তবে ধারণাগুলি যদি আপনার সাথে যেতে চান তবে আপনাকে চালিত করার জন্য পর্যাপ্ত ধারণা থাকা উচিত।

(এবং রেকর্ডের জন্য, যদি এটি কেবল একবারের জিনিস হয় তবে আপনি সম্ভবত প্রথমে যে পদ্ধতিটি উপস্থাপন করেছেন তা ব্যবহার করে আপনি সম্ভবত আরও ভাল। এগুলি হ্যাকির মতো বলে আপনি এতটা খারাপ বোধ করেন না))


1

আমি এটি করার জন্যও একটি শালীন উপায় খুঁজতে লড়াই করে যাচ্ছি, সুতরাং আমি কেবল একটি ধারণা নিয়ে এসেছি (রূপালী বুলেট নয়, যেহেতু এটি মূলত স্বাদের বিষয়)।

if bool(condition1 and
        condition2 and
        ...
        conditionN):
    foo()
    bar()

আমি অন্যদের সাথে দেখেছি এর তুলনায় এই সমাধানটিতে আমি কিছু গুণাবলীর সন্ধান পেয়েছি, যেমন, আপনি ঠিক অতিরিক্ত একটি অতিরিক্ত 4 স্পেস ইনডেন্টেশন (বুল) পান, যা সমস্ত শর্তকে উল্লম্বভাবে সীমাবদ্ধ করে দেয়, এবং যদি বিবৃতিটির শৃঙ্খলে প্রবেশ করতে পারে একটি পরিষ্কার (ish) উপায়। এটি বুলিয়ান অপারেটরগুলির শর্ট সার্কিট মূল্যায়নের সুবিধাগুলিও রাখে, তবে অবশ্যই কোনও ফাংশন কলের ওভারহেড যুক্ত করে যা মূলত কিছুই করে না। আপনি তর্ক করতে পারেন (যথাযথভাবে) যে কোনও যুক্তি তার যুক্তি ফিরিয়ে আনতে এখানে বুলের পরিবর্তে ব্যবহার করা যেতে পারে তবে আমি যেমন বলেছিলাম এটি কেবল একটি ধারণা এবং এটি শেষ পর্যন্ত স্বাদের বিষয়।

যথেষ্ট মজাদার, আমি যখন এটি লিখছিলাম এবং "সমস্যা" সম্পর্কে ভাবছিলাম তখন আমি আরও একটি ধারণা নিয়ে এসেছি , যা একটি ফাংশন কলের ওভারহেড সরিয়ে দেয়। আমরা অতিরিক্ত জোড়া বন্ধনী ব্যবহার করে একটি জটিল অবস্থার মধ্যে প্রবেশ করতে যাচ্ছি তা কেন বোঝাবেন না? যদি, আরও 2 বলুন, if স্টেটমেন্টের বডিটির সাথে সম্পর্কিত সাব-কন্ডিশনের একটি দুর্দান্ত 2 স্পেস ইন্ডেন্ট দিতে। উদাহরণ:

if (((foo and
      bar and
      frob and
      ninja_bear))):
    do_stuff()

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

যাইহোক, আরও দুটি প্রস্তাব যা আমি এখানে দেখিনি। আশা করি এটি কাউকে সাহায্য করবে :)


1

আপনি এটি দুটি লাইনে বিভক্ত করতে পারেন

total = cond1 == 'val' and cond2 == 'val2' and cond3 == 'val3' and cond4 == val4
if total:
    do_something()

অথবা এমনকি একবারে একটি শর্ত যোগ করুন। এই ভাবে, কমপক্ষে এটি বিশৃঙ্খলাটিকে পৃথকীকরণ থেকে পৃথক করে if


1

আমি জানি যে এই থ্রেডটি পুরানো, তবে আমার কাছে পাইথন ২.7 কোড রয়েছে এবং পাইচার্ম (৪.৫) এখনও এই মামলা সম্পর্কে অভিযোগ করে:

if foo is not None:
    if (cond1 == 'val1' and cond2 == 'val2' and
        cond3 == 'val3' and cond4 == 'val4'):
            # some comment about do_something
            do_something

এমনকি "পরবর্তী লজিকাল লাইনের মতো একই ইনডেন্টের সাথে ভিজ্যুয়াল ইন্টেন্টেড লাইন" পিইপি 8 সতর্কতার সাথেও, আসল কোডটি পুরোপুরি ঠিক আছে? এটি "ওভার-ইনডেন্টিং" নয়?

... এমন অনেক সময় আছে যখন আমি আশা করি পাইথন বুলেটটি বিট করে সবেমাত্র কোঁকড়া ধনুর্বন্ধনী বয়ে গেছে। আমি অবাক হই যে দুর্ঘটনাক্রমে ভুল অভিমুখে কয়েক বছর ধরে দুর্ঘটনাক্রমে কতগুলি বাগ প্রবর্তিত হয়েছে ...


0

আপনার অবস্থার তালিকাতে প্যাক করুন, তারপরে স্মিথ করুন। মত:

if False not in Conditions:
    do_something

0

আমি দেখতে পাচ্ছি যে আমার যখন দীর্ঘ শর্ত থাকে তখন আমার প্রায়শই একটি শর্ট কোড বডি থাকে। সেক্ষেত্রে আমি কেবল শরীরটি ডাবল ইনডেন্ট করি:

if (cond1 == 'val1' and cond2 == 'val2' and
    cond3 == 'val3' and cond4 == 'val4'):
        do_something

1
@ কারমা, আপনি কি প্রসারিত করবেন? এটা তোলে নিশ্চয় লাইন ধারাবাহিকতা অক্ষর, যা PEP 8 বিরুদ্ধে সুপারিশ করা হয় ব্যবহার করে চেয়ে ভালো
xorsyst

এটি আসলে লাইনের ধারাবাহিকতার জন্য একটি বৈধ ক্ষেত্রে। আইএমপিও প্যারেন্টেসিস একটি টিপল বা একটি ফাংশন কলকে বোঝায়। ওপির ব্যবহার খুব সি-জাতীয়, আমি যখনই সম্ভব পাইথন সিনট্যাক্স পছন্দ করি prefer আমি স্বীকার করি যে \ যদিও সর্বজনীনভাবে অনুকূল নয়।
দিমা তিসনেক

0
  if cond1 == 'val1' and \
     cond2 == 'val2' and \
     cond3 == 'val3' and \
     cond4 == 'val4':
      do_something

বা যদি এটি পরিষ্কার হয়:

  if cond1 == 'val1'\
     and cond2 == 'val2'\
     and cond3 == 'val3'\
     and cond4 == 'val4':
      do_something

এক্ষেত্রে ইনডেন্টটি 4 এর একাধিক হওয়া উচিত নয়, উদাহরণস্বরূপ "উদ্বোধনী ডিলিমিটারের সাথে সংযুক্ত" দেখুন:

http://google-styleguide.googlecode.com/svn/trunk/pyguide.html?showone=Indentation#Indentation


গুগলের গাইডও একটি জটিল অবস্থার উদাহরণ সরবরাহ করে , যা ওপি দ্বারা উল্লিখিত হিসাবে "এটি করার সর্বাধিক সুস্পষ্ট উপায়" এর সাথে মেলে। যদিও গাইড স্পষ্টভাবে দীর্ঘ "যদি" সেভাবে ফরম্যাটের পক্ষে সমর্থন করে না।
আন্তন স্ট্রগনফ

0

এখানে অন্য পদ্ধতির:

cond_list = ['cond1 == "val1"','cond2=="val2"','cond3=="val3"','cond4=="val4"']
if all([eval(i) for i in cond_list]):
 do something

এটি কেবলমাত্র তালিকায় অন্য শর্ত যুক্ত করে যদি বিবৃতি পরিবর্তন না করে সহজেই অন্য শর্ত যুক্ত করা সহজ করে তোলে:

cond_list.append('cond5=="val5"')


0

আমরা যদি নীচের মতো লিখতে পারি তার চেয়ে যদি আমাদের এবং অন্য কোনও শর্তে এর ভিতরে একাধিক বিবৃতি কার্যকর করতে হয়। প্রতিটি যখন আমরা এর ভিতরে একটি বিবৃতি সঙ্গে অন্য উদাহরণ আছে।

ধন্যবাদ এটি আমার জন্য কাজ করে।

#!/usr/bin/python
import sys
numberOfArgument =len(sys.argv)
weblogic_username =''
weblogic_password = ''
weblogic_admin_server_host =''
weblogic_admin_server_port =''


if numberOfArgument == 5:
        weblogic_username = sys.argv[1]
        weblogic_password = sys.argv[2]
        weblogic_admin_server_host =sys.argv[3]
        weblogic_admin_server_port=sys.argv[4]
elif numberOfArgument <5:
        print " weblogic UserName, weblogic Password and weblogic host details are Mandatory like, defalutUser, passwordForDefaultUser, t3s://server.domainname:7001 ."
        weblogic_username = raw_input("Enter Weblogic user Name")
        weblogic_password = raw_input('Enter Weblogic user Password')
        weblogic_admin_server_host = raw_input('Enter Weblogic admin host ')
        weblogic_admin_server_port = raw_input('Enter Weblogic admin port')
#enfelif
#endIf

0

আমার দুর্বলতা ক্ষমা করুন, তবে এটি ঘটে যায় যে আমি এখানে আপনারা কারও মতো # পাইথনের জ্ঞানহীন নই, তবে এমনটি ঘটে যে আমার নিজের অবজেক্টগুলি 3 ডি বিআইএম মডেলিংয়ে স্ক্রিপ্ট করার সময় আমি অনুরূপ কিছু পেয়েছি, তাই আমি আমার আলগোরিদমকে এই রূপে মানিয়ে নেব অজগর যে।

আমি এখানে যে সমস্যাটি পাই তা দ্বিপক্ষীয়:

  1. স্ক্রিপ্টটি বোঝার চেষ্টা করতে পারে এমন ব্যক্তির জন্য আমার কাছে বিদেশী বলে মনে করে।
  2. কোড রক্ষণাবেক্ষণ একটি উচ্চ মূল্যে আসবে, যদি সেই মানগুলি পরিবর্তন করা হয় (সবচেয়ে সম্ভবত

এই সমস্ত সমস্যা বাইপাস করতে, আপনার স্ক্রিপ্ট অবশ্যই এটি যেতে হবে

param_Val01 = Value 01   #give a meaningful name for param_Val(i) preferable an integer
param_Val02 = Value 02
param_Val03 = Value 03
param_Val04 = Value 04   # and ... etc

conditions = 0           # this is a value placeholder

########
Add script that if true will make:

conditions = conditions + param_Val01   #value of placeholder is updated
########

### repeat as needed


if conditions = param_Val01 + param_Val02 + param_Val03 + param_Val04:
    do something

এই পদ্ধতির পেশাদাররা:

  1. স্ক্রিপ্টটি পঠনযোগ্য।

  2. স্ক্রিপ্ট সহজে বজায় রাখা যায়।

  3. শর্তগুলি হ'ল মানগুলির সংখ্যার সাথে 1 তুলনা অপারেশন যা পছন্দসই শর্তগুলি উপস্থাপন করে।
  4. বহুস্তর অবস্থার প্রয়োজন নেই

আশা করি এটি আপনাদের সকলকে সাহায্য করবে

আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.