পাইথনের এই দীর্ঘ রেখাটি আমি কীভাবে ভাঙ্গতে পারি?


176

আপনি এর মতো দীর্ঘ লাইনের বিন্যাস সম্পর্কে কীভাবে যাবেন? আমি এটি 80 টিরও বেশি অক্ষরের চেয়ে বেশি পেতে চাই:

logger.info("Skipping {0} because its thumbnail was already in our system as {1}.".format(line[indexes['url']], video.title))

এটি কি আমার সেরা বিকল্প?

url = "Skipping {0} because its thumbnail was already in our system as {1}."
logger.info(url.format(line[indexes['url']], video.title))

1
একটি ভাল বিকল্প মত মনে হচ্ছে। আপনি এটি সম্পর্কে কি পছন্দ করেন না?
হামিশ গ্রুবিজন

2
একটু সাবজেক্টিভ, তাই না? :)
আদম ওও

1
সম্পর্কিত: stackoverflow.com/questions/1940710/… (পাইথনে স্ট্রিং
কনটেক্সটেশন

14
আপনি "এটিতে" ভুলটি মুছে ফেলে একটি অক্ষর সংরক্ষণ করতে পারেন।
jball

2
indexes: এর সঠিক বহুবচন indexহ'ল indices
স্ক্রুফি

উত্তর:


336

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

("This is the first line of my text, "
"which will be joined to a second.")

বা লাইনের সমাপ্তি ধারাবাহিকতা সহ যা এই কাজ করে যা কিছুটা ভঙ্গুর:

"This is the first line of my text, " \
"which will be joined to a second."

তবে এটি হয় না:

"This is the first line of my text, " \ 
"which will be joined to a second."

পার্থক্যটা দেখ? কোন? ঠিক আছে আপনি যখন এটি আপনার কোড হয় না।

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

বিকল্পভাবে, আপনি স্বাক্ষরকারী অপারেটর ( +) ব্যবহার করে স্পষ্টভাবে যোগদান করতে পারেন :

("This is the first line of my text, " + 
"which will be joined to a second.")

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

অবশেষে, আপনি ট্রিপল-উদ্ধৃত স্ট্রিং ব্যবহার করতে পারেন:

"""This is the first line of my text
which will be joined to a second."""

এটি প্রায়শই আমার প্রিয়, যদিও এর আচরণটি নিউলাইনের মতো কিছুটা আলাদা এবং পরবর্তী লাইনে থাকা কোনও শীর্ষস্থানীয় সাদা অংশ আপনার চূড়ান্ত স্ট্রিংয়ে প্রদর্শিত হবে। পালানো ব্যাকস্ল্যাশ দিয়ে আপনি নিউলাইনটি সরিয়ে ফেলতে পারেন।

"""This is the first line of my text \
which will be joined to a second."""

এটি উপরের একই কৌশল হিসাবে একই সমস্যা রয়েছে that সঠিক কোডটিতে কেবলমাত্র অদৃশ্য হোয়াইটস্পেসের দ্বারা ভুল কোড থেকে পৃথক।

কোনটি "সেরা" আপনার নির্দিষ্ট পরিস্থিতির উপর নির্ভর করে তবে উত্তরটি কেবল নান্দনিক নয়, তবে একটি ভিন্ন ভিন্ন আচরণের একটি।


26
সিপিথন সংকলক যথাসম্ভব আক্ষরিক ক্রিয়াকে অপ্টিমাইজ করে, যার অর্থ দুটি স্ট্রিং আক্ষরিক যোগ করার ফলে বাইটকোডে কেবল একটি একক স্ট্রিং আক্ষরিক ফলাফল ঘটে।
ইগনাসিও ওয়াজকেজ-আব্রামস

2
যদিও আমি পেয়েছি সমস্ত উত্তর সহায়ক, আপনার স্ট্রিংগুলি ভাঙ্গার সমস্ত উপায় বুঝতে আপনার অবশ্যই সহায়তা করে। "\" লাইনের সাথে সমস্যাটি কি শেষ হচ্ছিল যে এর পরেও একটি জায়গা ছিল?
গ্যাটারস্টার

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

1
@ খুরশিদআলাম আপনি 'সেই স্ট্রিংটি ধারণ করতে একক উদ্ধৃতি ব্যবহার করতে পারেন বা আপনার স্ট্রিংয়ের ভিতরে ডাবল উদ্ধৃতিগুলি থেকে বাঁচতে বা ট্রিপল ডাবল উদ্ধৃতি ব্যবহার করতে পারেন """। আক্ষরিক স্ট্রিং সংজ্ঞায়িত করতে আপনি একটি একক লাইন বা একাধিক লাইন ব্যবহার করেন কিনা তা উদ্ধৃতিযুক্ত উদ্ধৃতিযুক্ত স্ট্রিংগুলির সমস্যা একই।
hugovdberg

1
আমার সম্পাদক সর্বদা পেছনের সাদা স্থান সরান। আমি আপনাকে একই সেটিংস সক্ষম করার পরামর্শ দিচ্ছি। অবশ্যই তখন নতুন লাইনের সাদা স্থানটি এখনও স্ট্রিংয়ের অংশ, তাই আমি ব্যবহার করে শেষ করেছি +
থজায়

46

ধারাবাহিক স্ট্রিং লিটারালগুলি সংকলকটির সাথে যোগ দেয় এবং প্রথম বন্ধনীযুক্ত প্রকাশগুলি কোডের একক লাইন হিসাবে বিবেচিত হয়:

logger.info("Skipping {0} because it's thumbnail was "
  "already in our system as {1}.".format(line[indexes['url']],
  video.title))

11

ব্যক্তিগতভাবে আমি উন্মুক্ত ব্লকগুলি ঝুলানো পছন্দ করি না, তাই আমি এটিকে এটি রূপযুক্ত করব:

logger.info(
    'Skipping {0} because its thumbnail was already in our system as {1}.'
    .format(line[indexes['url']], video.title)
)

সাধারণভাবে আমি 80-কলামের লাইনের মধ্যে কোডটিকে ঠিক ফিট করার জন্য সংগ্রামকে খুব কষ্ট করতে চাই না। এটি লাইনের দৈর্ঘ্যকে যুক্তিসঙ্গত স্তরে রাখার পক্ষে মূল্যবান, তবে শক্ত 80 সীমাটি অতীতের একটি বিষয়।


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

3
আমি অবাক হই যে কতটি প্রকল্প এখনও 80 চরটি অনুসরণ করে। আমি যে গড় উইন্ডো আকারটি ব্যবহার করি তার জন্য, আমি মনে করি যে আমার জন্য ৮০ অক্ষরের চেয়ে 100-120 বেশি উত্পাদনশীল।
গ্যাটারস্টার

1
হ্যাঁ, আমি যে লাইনের দৈর্ঘ্যটি ব্যবহার করি তা প্রায় [হরর! sacrileg!] আমি একটি আনুপাতিক ফন্ট ব্যবহার করি, সুতরাং সঠিক লাইনের দৈর্ঘ্য এতটা সমালোচনা নয়। এটি একটি একক লাইনে কত যুক্তিযুক্ত যে কতগুলি অক্ষর যেমন পাঠযোগ্য, যেমন এটির আরও বেশি ঘটনা ... যদি আমার একটি দীর্ঘ স্ট্রিং থাকে যা কারোই পড়তে না হয় তবে আমি এটিকে ছড়িয়ে দিতে খুশী 120.
ববিনস

কোডের জন্য আনুষঙ্গিক হরফ - আমি ভাই আপনার সাথে আছি। আমি যে সকলের সাথে কখনও কাজ করেছি তাদের বিপর্যয় বিচার করে যদিও তাদের পক্ষে এই পৃথিবী প্রস্তুত ছিল না।
jlarcombe

4
~ 80 টি অক্ষর একই স্ক্রিনে পাশাপাশি পাশাপাশি 2 টি ফাইলের পার্থক্যকে আরও সহজ করে তোলে। এছাড়াও, যদি কোনও সার্ভারের কনসোলে ভয়াবহ জরুরী পরিস্থিতিতে আপনার কোনও ডিবাগিং আপনি 80 অক্ষরের সীমাটিকে সত্যই প্রশংসা করেন! :)
মিক টি

4

আপনি একাধিক লাইনে এটি ভাঙ্গতে পাঠ্য মোড়ক মডিউলটি ব্যবহার করতে পারেন

import textwrap
str="ABCDEFGHIJKLIMNO"
print("\n".join(textwrap.wrap(str,8)))

ABCDEFGH
IJKLIMNO

ডকুমেন্টেশন থেকে :

textwrap। মোড়ানো (পাঠ্য [, প্রস্থ [, ...]])
পাঠ্যের একক অনুচ্ছেদে মোড়ানো (একটি স্ট্রিং) যাতে প্রতিটি লাইন সর্বাধিক প্রস্থের অক্ষর দীর্ঘ হয়। চূড়ান্ত নিউলাইনগুলি ছাড়াই আউটপুট লাইনের একটি তালিকা ফেরত দেয়।

Alচ্ছিক কীওয়ার্ড আর্গুমেন্টগুলি TextWrapperনীচের নথিভুক্তির উদাহরণ বৈশিষ্ট্যের সাথে মিলে যায়। প্রস্থ ডিফল্ট 70

TextWrapper.wrap()মোড়ানো () কীভাবে আচরণ করে সে সম্পর্কে অতিরিক্ত তথ্যের জন্য পদ্ধতিটি দেখুন ।


2

যে কেউ .format()লম্বা স্ট্রিংয়েও কল করার চেষ্টা করছে এবং পরবর্তী .format(কলটি ভেঙে না ফেলে বেশ কয়েকটি জনপ্রিয় স্ট্রিং মোড়ানোর কৌশল ব্যবহার করতে অক্ষম , str.format("", 1, 2)তার পরিবর্তে আপনি এটি করতে পারেন "".format(1, 2)। এটি আপনার পছন্দসই কৌশলটি দিয়ে স্ট্রিংটি ভেঙে দেয়। উদাহরণ স্বরূপ:

logger.info("Skipping {0} because its thumbnail was already in our system as {1}.".format(line[indexes['url']], video.title))

হতে পারে

logger.info(str.format(("Skipping {0} because its thumbnail was already"
+ "in our system as {1}"), line[indexes['url']], video.title))

অন্যথায়, একমাত্র সম্ভাবনা হ'ল লাইন সমাপ্তি ধারাবাহিকতাগুলি ব্যবহার করা, যা আমি ব্যক্তিগতভাবে এর কোনও ভক্ত নই।

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