কীভাবে খুব দীর্ঘ স্ট্রিং লিখবেন যা PEP8 এর সাথে সামঞ্জস্যপূর্ণ এবং E501 প্রতিরোধ করবে


203

যেমন পিইপি 8 আপনার অজগর প্রোগ্রামটির 80 টি কলামের নিয়মের নীচে রাখার পরামর্শ দেয়, আমি কীভাবে লম্বা স্ট্রিং সহ এটি মেনে চলতে পারি, অর্থাৎ

s = "this is my really, really, really, really, really, really, really long string that I'd like to shorten."

আমি কীভাবে এটি নিম্নলিখিত লাইনে প্রসারিত করতে যাব

s = "this is my really, really, really, really, really, really" + 
    "really long string that I'd like to shorten."

উত্তর:


116

অন্তর্নিহিত কনটেন্টেশন সবচেয়ে পরিষ্কার সমাধান হতে পারে:

s = "this is my really, really, really, really, really, really," \
    " really long string that I'd like to shorten."

প্রতিচ্ছবি সম্পাদনা সম্পাদনা করে আমি সম্মত হই যে টডের লাইনের ধারাবাহিকতার চেয়ে বন্ধনী ব্যবহারের পরামর্শ তার সমস্ত কারণেই ভাল। আমার একমাত্র দ্বিধা হ'ল টিপলস দিয়ে বন্ধনীযুক্ত স্ট্রিংগুলিকে বিভ্রান্ত করা তুলনামূলকভাবে সহজ।


4
এই কারণেই আমি প্রশ্নটি পোস্ট করার মতো একটি বোকামির মতো অনুভব করেছি। চিয়ার্স।
ফেদেরার

8
এটি শেষ প্রান্তটি অবলম্বন করে লাইন ধারাবাহিকতা, নিছক নিখুঁত যুক্তি নয়, এবং পিইপি 8-তে খুব স্পষ্টভাবে নিষিদ্ধ হওয়া পর্যন্ত, যদিও এখন একটি ভাতা রয়েছে, তবে দীর্ঘ স্ট্রিংয়ের জন্য নয়। নীচের টডের উত্তরটি সঠিক।
অ্যারন হল

4
আমি পিইপি 8 পছন্দ করি তবে এটি পিইপি 8 এর একটি অংশ যা আমি পছন্দ করি না। আমি মনে করি যে অন্তর্নিহিত ধারাবাহিকতা আরও পরিষ্কার, কারণ
টিপলসের

1
মনে রাখবেন \ এর পরে কোনও ফাঁকা জায়গা যোগ করবেন না
মৃণাল সৌরভ

লম্বা লাইনটি যদি একটি দীর্ঘ মাল্টি-লাইনের স্ট্রিংয়ের মাঝখানে থাকে?
থায়নে

298

এছাড়াও, প্রতিবেশী স্ট্রিং ধ্রুবকগুলি স্বয়ংক্রিয়ভাবে সংক্ষিপ্ত হয়ে যাওয়ার কারণে আপনি এটির মতো কোডও করতে পারেন:

s = ("this is my really, really, really, really, really, really, "  
     "really long string that I'd like to shorten.")

কোন প্লাস চিহ্নটি নোট করুন, এবং আমি অতিরিক্ত কমা এবং স্পেস যুক্ত করেছি যা আপনার উদাহরণের ফর্ম্যাটটি অনুসরণ করে।

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

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

s = ("this is my really, really, really, really, really, really, " # comments ok
     "really long string that I'd like to shorten.")

আমি "পাইথন লাইনের দৈর্ঘ্য" এর একটি গুগল অনুসন্ধান ব্যবহার করেছি যা পিইপি 8 লিঙ্কটিকে প্রথম ফলাফল হিসাবে প্রত্যাবর্তন করে, তবে এই বিষয়ে আরও একটি ভাল স্ট্যাকওভারফ্লো পোস্টের সাথে লিঙ্ক করে: " পাইথন পিইপি -8 কেন সর্বোচ্চ 79৯ টি অক্ষরের দৈর্ঘ্য নির্দিষ্ট করতে হবে? "

আর একটি ভাল অনুসন্ধান বাক্যাংশ হবে "পাইথন লাইনের ধারাবাহিকতা"।


8
+1 টি: "ব্যক্তিগতভাবে আমি ব্যাকস্ল্যাশ পছন্দ না, এবং আমি কোথাও যে তার ব্যবহার আসলে এই রূপ, যার অনেক বেশী সুনিদৃষ্ট হয় পক্ষে অবচিত পড়া প্রত্যাহার মনে রাখুন।" স্পষ্ট অন্তর্নিহিত বেশী ভালো ""।
আলবার্তো Megía

13
প্রত্যেকের জন্য যারা একটি টিপল পায় এবং কেন বিস্মিত হয়। এখানে লাইনগুলির শেষে কমা যুক্ত করবেন না, এর ফলে একটি স্টুপ নয়, টিউপল হবে। ;)
বাগম্যানট 123

7
প্রদত্ত উদাহরণের চেয়ে আরও স্পষ্টতই + চরিত্রটি যুক্ত করা হচ্ছে না? আমি এখনও এই অন্তর্নিহিত বিবেচনা করব। অর্থাত্‍ "str1" + "str2"পরিবর্তে"str1" "str2"
ব্যবহারকারী 1318135

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

4
এই বাক্য গঠনটি স্ট্রিং ফর্ম্যাটিংয়ের প্রয়োগের সম্ভাবনাও রাখে:('this is my really, really, really, really, really long {} ' 'that I'd really, really, really, like to {}').format(var1, var2))
টিম

16

আমি মনে করি আপনার প্রশ্নের সবচেয়ে গুরুত্বপূর্ণ শব্দটি ছিল "পরামর্শ"।

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

দুঃখিত, এটি সরাসরি আপনার প্রশ্নের উত্তর দেয় না।


আমি সম্পূর্ণভাবে রাজী. একই রকম জাভা শৈলীর নিয়ম রয়েছে যা খুব অচল হয়ে গেছে (আইএমএইচও)।
ইকার জিমনেজ

হ্যাঁ আমি সম্মত, তবে আমি এই বিশেষ উদাহরণে কীভাবে এটি মেনে চলব তা আমার মাথা ঠাট্টা করছে। আমি সর্বদা ক্লাস, পদ্ধতিগুলি <80 টি অক্ষরে রাখার চেষ্টা করি, তবে আমি বলব এর মতো একটি স্ট্রিং সম্ভবত নেতিবাচক ব্যতীত অন্য কোনও প্রভাব ফেলবে না।
ফেদেরার

1
সম্প্রদায়-বিস্তৃত কোডিং স্ট্যান্ডার্ডের বিরুদ্ধে আপনার ব্যক্তিগত পছন্দকেও বিবেচনা করতে হবে। আপনি চান যে নতুন লোকেরা আসতে পারবে এবং প্রথম দিন থেকেই কোড বিন্যাসে স্বাচ্ছন্দ্য বোধ করবে।
retracile

1
আমি নিজের নিজের জন্য জানি, আমি ৮০ টি চরিত্রের সীমা ধরে রেখেছি কারণ আমি এখনও আমার বেশিরভাগ কোডিং আইডলিতে করি এবং এটি যেভাবে অনুভূমিক স্ক্রোলিং পরিচালনা করে তা আমি পছন্দ করি না। (কোনও স্ক্রোল বার নেই)
টফিস্টেডেথ

@ রেট্রেসাইল - হ্যাঁ, আপনি করেন। আমি বলছি না "আপনাকে অবশ্যই দিকনির্দেশটিকে উপেক্ষা করতে হবে", বরং পরামর্শ দিচ্ছি যে কিছু ক্ষেত্রে নির্দেশিকাটি সম্প্রদায়ের ভালোর জন্য প্রয়োজন নেই। আমি আইডিএল এর বিধিনিষেধ সম্পর্কে অবহিত ছিলাম না (যেমন টফিস্টেথ দ্বারা পোস্ট করা হয়েছিল) তবে সেই পরিস্থিতিতে সম্মেলনটি অনুসরণ করার জন্য একটি তর্ক যুক্তি রয়েছে।
জেম্বোশিপ

13

আপনি একটি জায়গা হারিয়েছেন এবং আপনার সম্ভবত একটি রেখার ধারাবাহিকতা অক্ষর প্রয়োজন, যেমন। ক \

s = "this is my really, really, really, really, really, really" +  \
    " really long string that I'd like to shorten."

অথবা এমনকি:

s = "this is my really, really, really, really, really, really"  \
    " really long string that I'd like to shorten."

পেরেনগুলিও লাইনের ধারাবাহিকতার পরিবর্তে কাজ করবে তবে আপনি এমন কাউকে ঝুঁকিপূর্ণ মনে করছেন যে আপনি একটি টিউপল রাখার ইচ্ছা করেছিলেন এবং সবেমাত্র কমাটি ভুলে গিয়েছিলেন। উদাহরণস্বরূপ নিন:

s = ("this is my really, really, really, really, really, really"
    " really long string that I'd like to shorten.")

বনাম:

s = ("this is my really, really, really, really, really, really",
    " really long string that I'd like to shorten.")

পাইথনের ডায়নামিক টাইপিংয়ের সাথে কোডটি যে কোনও উপায়ে চলতে পারে তবে আপনি যা চাননি তার সাথে ভুল ফলাফল তৈরি করতে পারে।


2

ব্যাকস্ল্যাশ:

s = "this is my really, really, really, really, really, really" +  \
    "really long string that I'd like to shorten."

বা পেরেন্সে মোড়ানো:

s = ("this is my really, really, really, really, really, really" + 
    "really long string that I'd like to shorten.")

2
নোট করুন যে প্লাসটি প্রয়োজনীয়। পাইথন স্ট্রিং লিটারেলগুলি একে অপরকে অনুসরণ করে conc
বুকজোর

2

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

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

from paragraphs import par


class SuddenDeathError(Exception):
    def __init__(self, cause: str) -> None:
        self.cause = cause

    def __str__(self):
        return par(
            f""" Y - e - e - e - es, Lord love you! Why should she die of
            {self.cause}? She come through diphtheria right enough the year
            before. I saw her with my own eyes. Fairly blue with it, she
            was. They all thought she was dead; but my father he kept ladling
            gin down her throat till she came to so sudden that she bit the bowl
            off the spoon. 

            What call would a woman with that strength in her have to die of
            {self.cause}? What become of her new straw hat that should have
            come to me? Somebody pinched it; and what I say is, them as pinched
            it done her in."""
        )


raise SuddenDeathError("influenza")

হয়ে ...

__main__.SuddenDeathError: Y - e - e - e - es, Lord love you! Why should she die of influenza? She come through diphtheria right enough the year before. I saw her with my own eyes. Fairly blue with it, she was. They all thought she was dead; but my father he kept ladling gin down her throat till she came to so sudden that she bit the bowl off the spoon.

What call would a woman with that strength in her have to die of influenza? What become of her new straw hat that should have come to me? Somebody pinched it; and what I say is, them as pinched it done her in.

(ভিম) 'জিকিউ' দিয়ে সহজেই সমস্ত কিছু লাইন


0

একটি দিয়ে \আপনি একাধিক লাইনে বিবৃতি প্রসারিত করতে পারেন:

s = "this is my really, really, really, really, really, really" + \
"really long string that I'd like to shorten."

কাজ করা উচিত.


0

বড় স্ট্রিং নির্দিষ্ট করার জন্য আমি এখানে উল্লেখ না করা কয়েকটি পদ্ধতি ব্যবহার করার ঝোঁক করি, তবে এগুলি খুব নির্দিষ্ট দৃশ্যের জন্য। YMMV ...

  • পাঠ্যের একাধিক লাইনের ব্লবগুলি প্রায়শই বিন্যাসিত টোকেন সহ (আপনি যা জিজ্ঞাসা করছিলেন তা তেমন নয় তবে এখনও দরকারী):

    error_message = '''
    I generally like to see how my helpful, sometimes multi-line error
    messages will look against the left border.
    '''.strip()
  • আপনার পছন্দসই স্ট্রিং ইন্টারপোলেশন পদ্ধতির মাধ্যমে পরিবর্তনশীল টুকরো টুকরো বৃদ্ধি করুন:

    var = 'This is the start of a very,'
    var = f'{var} very long string which could'
    var = f'{var} contain a ridiculous number'
    var = f'{var} of words.'
  • এটি একটি ফাইল থেকে পড়ুন। পিইপি -8 কোনও ফাইলের স্ট্রিংয়ের দৈর্ঘ্য সীমাবদ্ধ করে না; আপনার কোডের লাইন। :)

  • নিউলাইনগুলি ব্যবহার করে স্ট্রিংটিকে মানাগেবল লাইনে বিভক্ত করতে ব্রুট-ফোর্স বা আপনার সম্পাদক ব্যবহার করুন এবং তারপরে সমস্ত নিউলাইনগুলি সরান। (আমি তালিকাভুক্ত প্রথম কৌশলটির মতো):

    foo = '''
    agreatbigstringthatyoudonotwanttohaveanyne
    wlinesinbutforsomereasonyouneedtospecifyit
    verbatimintheactualcodejustlikethis
    '''.replace('\n', '')

0

উপলব্ধ বিকল্প:

  • ব্যাকস্ল্যাশ :"foo" \ "bar"
  • ব্যাকস্ল্যাশ অনুসরণ প্লাস চিহ্ন :"foo" + \ "bar"
  • বন্ধনী :
    • ("foo" "bar")
    • বন্ধনীর সঙ্গে যোগ চিহ্ন :("foo" + "bar")
    • পিইপি 8, ই 502: ব্যাকস্ল্যাশ বন্ধনীগুলির মধ্যে অপ্রয়োজনীয়

এড়াতে

কমা সহ বন্ধনীগুলি এড়িয়ে চলুন: ("foo", "bar")যা একটি টিউপল সংজ্ঞায়িত করে।


>>> s = "a" \
... "b"
>>> s
'ab'
>>> type(s)
<class 'str'>
>>> s = "a" + \
... "b"
>>> s
'ab'
>>> type(s)
<class 'str'>
>>> s = ("a"
... "b")
>>> type(s)
<class 'str'>
>>> print(s)
ab
>>> s = ("a",
... "b")
>>> type(s)
<class 'tuple'>
>>> s = ("a" + 
... "b")
>>> type(s)
<class 'str'>
>>> print(s)
ab
>>> 

0

যদি আপনাকে অবশ্যই একটি দীর্ঘ স্ট্রিং আক্ষরিক sertোকানো এবং flake8 বন্ধ করতে চান, আপনি এটি শাট আপ নির্দেশিকা ব্যবহার করতে পারেন । উদাহরণস্বরূপ, একটি পরীক্ষার রুটিনে আমি কিছু জাল CSV ইনপুট সংজ্ঞায়িত করেছি। আমি দেখতে পেয়েছি যে এটির সারি রয়েছে এমন আরও লাইনগুলিতে এটি বিভক্ত করা তীব্র বিভ্রান্তিকর হবে, তাই আমি নীচে একটি যুক্ত করার সিদ্ধান্ত নিয়েছি # noqa: E501:

csv_test_content = """"STATION","DATE","SOURCE","LATITUDE","LONGITUDE","ELEVATION","NAME","REPORT_TYPE","CALL_SIGN","QUALITY_CONTROL","WND","CIG","VIS","TMP","DEW","SLP","AA1","AA2","AY1","AY2","GF1","MW1","REM"
"94733099999","2019-01-03T22:00:00","4","-32.5833333","151.1666666","45.0","SINGLETON STP, AS","FM-12","99999","V020","050,1,N,0010,1","22000,1,9,N","025000,1,9,9","+0260,1","+0210,1","99999,9","24,0000,9,1",,"0,1,02,1","0,1,02,1","01,99,1,99,9,99,9,99999,9,99,9,99,9","01,1","SYN05294733 11/75 10502 10260 20210 60004 70100 333 70000="
"94733099999","2019-01-04T04:00:00","4","-32.5833333","151.1666666","45.0","SINGLETON STP, AS","FM-12","99999","V020","090,1,N,0021,1","22000,1,9,N","025000,1,9,9","+0378,1","+0172,1","99999,9","06,0000,9,1",,"0,1,02,1","0,1,02,1","03,99,1,99,9,99,9,99999,9,99,9,99,9","03,1","SYN04294733 11/75 30904 10378 20172 60001 70300="
"94733099999","2019-01-04T22:00:00","4","-32.5833333","151.1666666","45.0","SINGLETON STP, AS","FM-12","99999","V020","290,1,N,0057,1","99999,9,9,N","020000,1,9,9","+0339,1","+0201,1","99999,9","24,0000,9,1",,"0,1,02,1","0,1,02,1",,"02,1","SYN05294733 11970 02911 10339 20201 60004 70200 333 70000="
"94733099999","2019-01-05T22:00:00","4","-32.5833333","151.1666666","45.0","SINGLETON STP, AS","FM-12","99999","V020","200,1,N,0026,1","99999,9,9,N","000100,1,9,9","+0209,1","+0193,1","99999,9","24,0004,3,1",,"1,1,02,1","1,1,02,1","08,99,1,99,9,99,9,99999,9,99,9,99,9","51,1","SYN05294733 11/01 82005 10209 20193 69944 75111 333 70004="
"94733099999","2019-01-08T04:00:00","4","-32.5833333","151.1666666","45.0","SINGLETON STP, AS","FM-12","99999","V020","070,1,N,0026,1","22000,1,9,N","025000,1,9,9","+0344,1","+0213,1","99999,9","06,0000,9,1",,"2,1,02,1","2,1,02,1","04,99,1,99,9,99,9,99999,9,99,9,99,9","02,1","SYN04294733 11/75 40705 10344 20213 60001 70222="
"""  # noqa: E501

-1

আমি অতীতে টেক্সট র্যাপ.ডেন্ট ব্যবহার করেছি। এটি একটু কষ্টকর তাই আমি এখনই লাইনের ধারাবাহিকতা পছন্দ করি তবে আপনি যদি সত্যিই ব্লক ইনডেন্ট চান তবে আমার মনে হয় এটি দুর্দান্ত।

উদাহরণ কোড (যেখানে ছাঁটাইটি প্রথম '\ n' কে স্লাইস দিয়ে মুক্তি দিতে হবে):

import textwrap as tw
x = """\
       This is a yet another test.
       This is only a test"""
print(tw.dedent(x))

ব্যাখ্যা:

উত্সাহী একটি নতুন লাইনের আগে পাঠ্যের প্রথম লাইনে সাদা স্থানের ভিত্তিতে ইন্ডেন্টেশন গণনা করে। আপনি যদি এটি টুইট করতে চান, আপনি সহজেই এটি ব্যবহার করে এটি পুনরায় প্রয়োগ করতে পারেনre মডিউলটি ।

এই পদ্ধতির সীমাবদ্ধতা রয়েছে যে খুব দীর্ঘ রেখাগুলিতে এখনও আপনার চেয়ে বেশি দীর্ঘ হতে পারে সেই ক্ষেত্রে স্ট্রিংগুলিকে সংযুক্তকারী অন্যান্য পদ্ধতিগুলি আরও উপযুক্ত।


1
x[1:]আপনার সাথে ছাঁটাইয়ের পরিবর্তে x = """প্রথম নিউলাইনটি এড়াতে আপনি একটি ব্যাকস্ল্যাশ রাখতে পারেন ।
মাইকেল ডান
আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.