পাইথন মাল্টলাইন স্ট্রিংগুলির জন্য সঠিক ইনডেন্টেশন


455

একটি ফাংশনের মধ্যে পাইথন মাল্টলাইন স্ট্রিংগুলির জন্য সঠিক ইন্ডেন্টেশনটি কী?

    def method():
        string = """line one
line two
line three"""

অথবা

    def method():
        string = """line one
        line two
        line three"""

অথবা অন্য কিছু?

প্রথম উদাহরণে ফাংশনের বাইরে স্ট্রিংটি ঝুলতে একরকম অদ্ভুত দেখাচ্ছে।


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

@ এভেজেনিসারজিভ প্রক্রিয়াজাতকরণ সরঞ্জামটি এই কাজটি সম্পাদন করে (এবং এটি আপনার প্রক্রিয়াকরণ সরঞ্জামের পছন্দ উপর নির্ভর করে)। method.__doc__পাইথন নিজেই অন্য কোনও strআক্ষরিকের চেয়ে বেশি পরিবর্তন করেনি ।
সিজেড

উত্তর:


453

আপনি সম্ভবত এর সাথে লাইন করতে চান """

def foo():
    string = """line one
             line two
             line three"""

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

def foo():
    string = ("this is an "
              "implicitly joined "
              "string")

আপনার যে অংশগুলির প্রয়োজন নেই তা ছাঁটাতে আপনি যদি একাধিক স্ট্রিং পোস্টপোসেস করতে চান তবে আপনার পিইপি 257textwrap তে উপস্থাপিত পোস্টপ্রসেসিং ডকাস্ট্রিংয়ের মডিউল বা কৌশলটি বিবেচনা করা উচিত :

def trim(docstring):
    if not docstring:
        return ''
    # Convert tabs to spaces (following the normal Python rules)
    # and split into a list of lines:
    lines = docstring.expandtabs().splitlines()
    # Determine minimum indentation (first line doesn't count):
    indent = sys.maxint
    for line in lines[1:]:
        stripped = line.lstrip()
        if stripped:
            indent = min(indent, len(line) - len(stripped))
    # Remove indentation (first line is special):
    trimmed = [lines[0].strip()]
    if indent < sys.maxint:
        for line in lines[1:]:
            trimmed.append(line[indent:].rstrip())
    # Strip off trailing and leading blank lines:
    while trimmed and not trimmed[-1]:
        trimmed.pop()
    while trimmed and not trimmed[0]:
        trimmed.pop(0)
    # Return a single string:
    return '\n'.join(trimmed)

10
এটি লাইনের ধারাবাহিকতার 'হ্যাঙ্গিং ইনডেন্ট' স্টাইল। এটি PEP8 এ ফাংশন সংজ্ঞা এবং দীর্ঘ যদি স্টেটমেন্টগুলির মতো উদ্দেশ্যে নির্ধারিত হয়, যদিও মাল্টলাইন স্ট্রিংয়ের জন্য উল্লেখ করা হয়নি। ব্যক্তিগতভাবে এটি এমন এক জায়গা যেখানে আমি পিইপি 8 অনুসরণ করতে অস্বীকার করি (এবং পরিবর্তে 4-স্পেস ইনডেন্টিং ব্যবহার করি), কারণ আমি ঝুলন্ত ইনডেন্টগুলি দৃ strongly়ভাবে অপছন্দ করি, যা আমার জন্য প্রোগ্রামটির সঠিক কাঠামোকে অস্পষ্ট করে দেয়।
ববিনস

2
@ বাফার, অফিশিয়াল টিউটোরিয়ালের ৩.১.২-এ ("একে অপরের পাশে দুটি স্ট্রিং লিটারেলগুলি স্বয়ংক্রিয়ভাবে সংক্ষিপ্ত হয় ...") এবং ভাষা রেফারেন্সে।
মাইক গ্রাহাম

5
স্বয়ংক্রিয় স্ট্রিং সংক্ষেপণ সহ দ্বিতীয় ফর্মটিতে নতুন লাইন অন্তর্ভুক্ত নয় এটি একটি বৈশিষ্ট্য।
মাইক গ্রাহাম

18
trim()যেমন PEP257 উল্লেখিত ফাংশন হিসাবে মান গ্রন্থাগার বাস্তবায়িত হয় inspect.cleandoc

2
@Bobince +1 এর এখানে "ঝুলন্ত ইনডেন্ট" প্রত্যাখ্যান ... বিশেষ করে কারন যদি আপনার কাছ থেকে পরিবর্তনশীল নাম পরিবর্তন সম্পর্কে মন্তব্য stringকরতে textঅথবা একটি ভিন্ন দৈর্ঘ্য কিছু, তাহলে আপনি এখন খাঁজ আপডেট করা দরকার আক্ষরিক প্রতিটি একক লাইন মাল্টিলাইন স্ট্রিং এটি """সঠিকভাবে মেলে জন্য পেতে । ইন্ডেন্টেশন কৌশল ভবিষ্যতের রিফ্যাক্টর / রক্ষণাবেক্ষণকে জটিল করে তুলবে না এবং এটি এমন একটি স্থান যা পিইপি সত্যই ব্যর্থ হয়
কেভলার ২0

253

textwrap.dedentফাংশন এক সঙ্গে শুরু করতে পারবেন উৎস সঠিক খাঁজ , এবং তারপর ব্যবহারের পূর্বে লেখা থেকে এটা স্ট্রিপ।

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

import textwrap

def frobnicate(param):
    """ Frobnicate the scrognate param.

        The Weebly-Ruckford algorithm is employed to frobnicate
        the scrognate to within an inch of its life.

        """
    prepare_the_comfy_chair(param)
    log_message = textwrap.dedent("""\
            Prepare to frobnicate:
            Here it comes...
                Any moment now.
            And: Frobnicate!""")
    weebly(param, log_message)
    ruckford(param)

\আক্ষরিক লগ বার্তাটি অনুসরণ করে তা নিশ্চিত করা যে লাইন ব্রেকটি আক্ষরিক নয়; এইভাবে, আক্ষরিক একটি ফাঁকা লাইন দিয়ে শুরু হয় না, এবং এর পরিবর্তে পরবর্তী সম্পূর্ণ লাইন দিয়ে শুরু হয়।

এর থেকে প্রাপ্ত মান textwrap.dedentহ'ল স্ট্রিংয়ের প্রতিটি লাইনে সরানো সমস্ত সাধারণ নেতৃস্থানীয় হোয়াইটস্পেস ইনডেন্টেশন সহ ইনপুট স্ট্রিং। সুতরাং উপরের log_messageমানটি হবে:

Prepare to frobnicate:
Here it comes...
    Any moment now.
And: Frobnicate!

1
যদিও এটি একটি যুক্তিসঙ্গত সমাধান এবং এটি জেনে রাখা সুন্দর, প্রায়শই ডাকা ফাংশনের অভ্যন্তরে এই জাতীয় কিছু করা বিপর্যয় হিসাবে প্রমাণিত হতে পারে।
haridsv

@haridsv কেন এটি একটি বিপর্যয় হবে?
jtmoulia

10
@ জিটমোলিয়া: দুর্যোগের চেয়ে আরও ভাল বিবরণটি "অদক্ষ" হবে কারণ textwrap.dedent()কলটির ফলাফল তার ইনপুট আর্গুমেন্টের মতো একটি ধ্রুবক মান।
মার্টিনো

2
@haridsv যে দুর্যোগ / অযোগ্যতা মূল হল definining একটি ধ্রুবক স্ট্রিং ভিতরে একটি ঘন ঘন নামক ফাংশন। প্রতি কল কল দেখার জন্য প্রতি কল স্থির সংজ্ঞাটি বাণিজ্য করা সম্ভব trade এইভাবে উত্সর্গীকৃত প্রিপ্রোসেসিং কেবল একবার চালিত হত । একটি প্রাসঙ্গিক প্রশ্ন স্ট্যাকওভারফ্লো.com/q/15495376/611007 হতে পারে এটি প্রতিটি কল প্রতি ধ্রুবক সংজ্ঞা এড়াতে আইডিয়া তালিকাভুক্ত করে। তবুও বিকল্পগুলির জন্য একটি চেহারা প্রয়োজন বলে মনে হচ্ছে। তবুও, এটি সংরক্ষণের অনুকূল জায়গাটি সন্ধান করার বিভিন্ন উপায় চেষ্টা করা হয়েছে। উদাহরণস্বরূপ: def foo: return foo.xতারপরে পরবর্তী লাইন foo.x = textwrap.dedent("bar")
n611x007

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

52

এর inspect.cleandocমতো ব্যবহার করুন :

def method():
    string = inspect.cleandoc("""
        line one
        line two
        line three""")

প্রত্যাশিত ইন্ডেন্টেশন প্রত্যাশা অনুযায়ী বজায় রাখা হবে। নীচে মন্তব্য হিসাবে , আপনি যদি খালি লাইন পূর্ববর্তী রাখতে চান, ব্যবহার করুন textwrap.dedent। তবে এটি প্রথম লাইন বিরতি রাখে।

দ্রষ্টব্য: কাঠামোটি পরিষ্কার করার জন্য কোড সম্পর্কিত লজিকাল ব্লক সম্পর্কিত প্রাসঙ্গিক হিসাবে যুক্ত করা ভাল অনুশীলন। যেমন ভেরিয়েবলের অন্তর্ভুক্ত মাল্টি-লাইন স্ট্রিং string


5
এতটা বিভ্রান্ত কেন এই উত্তরটি এখনও অবধি বিদ্যমান ছিল না, পাইথন ২.6 এরinspect.cleandoc পর থেকেই আছে যা ২০০৮ ছিল ..? একেবারে পরিষ্কার উত্তর, বিশেষত কারণ এটি হ্যাঙ্গিং ইনডেন্ট স্টাইলটি ব্যবহার করে না, যা কেবলমাত্র একটি অপ্রয়োজনীয় পরিমাণের জায়গা নষ্ট করে
কেভেলার ২৮

1
এই সমাধানটি ফাঁকা পাঠ্যের প্রথম কয়েকটি লাইন সরিয়ে দেয় (যদি থাকে)। যদি আপনি সেই আচরণটি না চান তবে Textwrap.dedent docs.python.org/2/library/textwrap.html#textwrap.dedent
joshuakcockrell

1
এটি পারফেক্ট!
zzzz zzzz

23

একটি বিকল্প যা অন্য উত্তরগুলি থেকে অনুপস্থিত মনে হচ্ছে (কেবলমাত্র নকশার মন্তব্যে গভীরভাবে উল্লেখ করা হয়েছে) নিম্নলিখিতটি হল:

def foo():
    string = ("line one\n"          # Add \n in the string
              "line two"  "\n"      # Add "\n" after the string
              "line three\n")

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

এটির জন্য কোনও পোস্ট প্রসেসিংয়ের প্রয়োজন হয় না, তবে আপনাকে \nলাইনটি শেষ হতে চান এমন কোনও স্থানে ম্যানুয়ালি যুক্ত করতে হবে। হয় ইনলাইন বা পরে পৃথক স্ট্রিং হিসাবে। পরবর্তীটি অনুলিপি করা সহজ।


দ্রষ্টব্য যে এটি কোনও অন্তর্নির্মিত স্ট্রিং নয়, অন্তর্নিহিত স্ট্রিংয়ের উদাহরণ of
ট্রেক

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

17

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

from matplotlib.cbook import dedent

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

"""
line 1 of string
line 2 of string
"""

"""\
line 1 of string
line 2 of string
"""

"""line 1 of string
line 2 of string
"""

এই তিনটি উদাহরণে ম্যাটপ্ল্লোলিব ডেডিকেটেড ব্যবহার করলে একই বুদ্ধিমান ফলাফল আসবে। পাঠ্য মোড়ক ডেডেন্ট ফাংশনটির 1 ম উদাহরণ সহ একটি শীর্ষস্থানীয় ফাঁকা রেখা থাকবে।

স্পষ্টত অসুবিধাটি হ'ল পাঠ্য মোড়কটি স্ট্যান্ডার্ড লাইব্রেরিতে রয়েছে এবং ম্যাটপ্লটলিব বহিরাগত মডিউল।

কিছু ট্রেড অফস এখানে ... উত্সর্গীকৃত ফাংশনগুলি আপনার কোডগুলি আরও পঠনযোগ্য করে তোলে যেখানে স্ট্রিংগুলি সংজ্ঞায়িত করা হয়, তবে পরে ব্যবহারযোগ্য বিন্যাসে স্ট্রিংটি পেতে প্রক্রিয়াজাতকরণ প্রয়োজন require ডকাস্ট্রিংগুলিতে এটি সুস্পষ্ট যে আপনার সঠিক ইনডেন্টেশনটি ব্যবহার করা উচিত কারণ ডকস্ট্রিংয়ের বেশিরভাগ ব্যবহারগুলি প্রয়োজনীয় প্রক্রিয়াজাতকরণ করবে।

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

def example():
    long_string = '''\
Lorem ipsum dolor sit amet, consectetur adipisicing
elit, sed do eiusmod tempor incididunt ut labore et
dolore magna aliqua. Ut enim ad minim veniam, quis
nostrud exercitation ullamco laboris nisi ut aliquip.\
'''
    return long_string

print example()

6

আপনি যদি দ্রুত এবং সহজ সমাধান চান এবং নতুন লাইনের টাইপিং থেকে নিজেকে বাঁচান, আপনি পরিবর্তে একটি তালিকা বেছে নিতে পারেন, যেমন:

def func(*args, **kwargs):
    string = '\n'.join([
        'first line of very long string and',
        'second line of the same long thing and',
        'third line of ...',
        'and so on...',
        ])
    print(string)
    return

যদিও এটি সর্বোত্তম পদ্ধতির নয়, আমি এটি সময়ে সময়ে ব্যবহার করেছি। আপনি যদি এটি ব্যবহার করেন তবে আপনার তালিকার পরিবর্তে একটি টুপল ব্যবহার করা উচিত, কারণ এতে যোগদানের আগে এটি পরিবর্তন করা যাচ্ছে না।
ল্যান্ডসি সাইমন

4

আমি পছন্দ করি

    def method():
        string = \
"""\
line one
line two
line three\
"""

অথবা

    def method():
        string = """\
line one
line two
line three\
"""

1
এটি প্রশ্নের উত্তর দেয় না, কারণ প্রশ্নটি স্পষ্টভাবে জানিয়েছে যে ইনডেন্টেশন (ফাংশনের মধ্যে) গুরুত্বপূর্ণ।
বিগনোজ করুন

@ বিগনোজ প্রশ্নটি বলেছিল "এটি একধরণের অদ্ভুত দেখাচ্ছে" ব্যবহার করতে নিষেধ।
lk_vc

কুরুচিপূর্ণ ইন্ডেন্টেশন না করে আমি কীভাবে এটি সম্পাদন করব?
lfender6445

@ lfender6445 ভাল, সম্ভবত আপনি এই কোডগুলি অন্যান্য কোড থেকে পৃথক ফাইলে
রাখতে পারেন

3

আমার দুটি সেন্ট, ইনডেন্টগুলি পেতে লাইনের শেষ প্রান্তে পালাতে:

def foo():
    return "{}\n"\
           "freq: {}\n"\
           "temp: {}\n".format( time, freq, temp )

1

আমি এখানে প্রিন্টিংয়ের জন্য ডক্ট্রিংয়ের সনাক্তকরণ স্তরটি মুছে ফেলার / সংশোধন করার জন্য একটি সাধারণ 1-লাইনার সন্ধান করতে এসেছি যাতে এটি অস্বচ্ছ দেখাচ্ছে না , উদাহরণস্বরূপ স্ক্রিপ্টের মধ্যে এটি "ফাংশনের বাইরে স্তব্ধ" করে।

আমি এখানে যা শেষ করেছি তা এখানে:

import string
def myfunction():

    """
    line 1 of docstring
    line 2 of docstring
    line 3 of docstring"""

print str(string.replace(myfunction.__doc__,'\n\t','\n'))[1:] 

স্পষ্টতই, আপনি যদি ট্যাব কী-এর পরিবর্তে ফাঁকা স্থান (যেমন 4) দিয়ে ইনডেন্ট করছেন তবে পরিবর্তে এর মতো কিছু ব্যবহার করুন:

print str(string.replace(myfunction.__doc__,'\n    ','\n'))[1:]

এবং এর পরিবর্তে যদি আপনার ডকাস্ট্রিংগুলি দেখতে ভাল লাগে তবে আপনার প্রথম অক্ষরটি সরিয়ে ফেলতে হবে না:

    """line 1 of docstring
    line 2 of docstring
    line 3 of docstring"""

print string.replace(myfunction.__doc__,'\n\t','\n') 

এটি শ্রেণিবদ্ধ পদ্ধতি এবং নেস্টেড ক্লাসগুলিতে ব্যর্থ।
টাকাসওয়েল

1

প্রথম বিকল্পটি ভাল - ইন্ডেন্টেশন অন্তর্ভুক্ত রয়েছে। এটি পাইথন স্টাইলে রয়েছে - কোডটির জন্য পাঠযোগ্যতা সরবরাহ করে।

এটি সঠিকভাবে প্রদর্শন করতে:

print string.lstrip()

এটি ট্রিপল উদ্ধৃতি স্ট্রিংগুলির ফর্ম্যাট করার সহজ এবং পরিষ্কার পদ্ধতির মতো বলে মনে হচ্ছে যাতে ইনডেন্টেশনের কারণে আপনার কাছে অতিরিক্ত স্থান নেই
টেলর লিস

4
এটি কেবলমাত্র একটি বহুলাইন স্ট্রিংয়ের প্রথম লাইনে শীর্ষস্থানীয় স্থানগুলি মুছে ফেলবে। এটি নিম্নলিখিত লাইনগুলিকে বিন্যাস করতে সহায়তা করে না।
এম শ্লেঙ্কার

0

এটি নির্ভর করে আপনি কীভাবে পাঠ্যটি প্রদর্শন করতে চান। যদি আপনি চান যে এটি সমস্ত বাম-সারিবদ্ধ হয় তবে তা হয় প্রথম স্নিপেটের মতো ফর্ম্যাট করুন বা সমস্ত স্থান বাম-ছাঁটাই করে রেখাগুলির মাধ্যমে পুনরাবৃত্তি করুন।


5
পথ docstring প্রক্রিয়াকরণ সরঞ্জাম কাজ নয় অপসারণ করা হয় সব বাম স্থান, কিন্তু যতটা প্রথম ইন্ডেন্টযুক্ত লাইন হিসেবে। এই কৌশলটি খানিকটা পরিশীলিত এবং আপনার পোস্টটি প্রবাহিত স্ট্রিংয়ে সম্মানিত করতে আপনাকে মঞ্জুরি দেয়।
মাইক গ্রাহাম

0

স্ট্রিংগুলির জন্য আপনি স্ট্রিং প্রক্রিয়া করার পরে ঠিক করতে পারেন। ডকাস্ট্রিংগুলির জন্য আপনার পরিবর্তে ফাংশনটি প্রক্রিয়া করার পরে প্রয়োজন। এখানে উভয়ের জন্য একটি সমাধান এখানে এখনও পাঠযোগ্য।

class Lstrip(object):
    def __rsub__(self, other):
        import re
        return re.sub('^\n', '', re.sub('\n$', '', re.sub('\n\s+', '\n', other)))

msg = '''
      Lorem ipsum dolor sit amet, consectetur adipiscing elit, sed do eiusmod
      tempor incididunt ut labore et dolore magna aliqua. Ut enim ad minim
      veniam, quis nostrud exercitation ullamco laboris nisi ut aliquip ex ea
      commodo consequat. Duis aute irure dolor in reprehenderit in voluptate
      velit esse cillum dolore eu fugiat nulla pariatur. Excepteur sint occaecat
      cupidatat non proident, sunt in culpa qui officia deserunt mollit anim id
      est laborum.
      ''' - Lstrip()

print msg

def lstrip_docstring(func):
    func.__doc__ = func.__doc__ - Lstrip()
    return func

@lstrip_docstring
def foo():
    '''
    Lorem ipsum dolor sit amet, consectetur adipiscing elit, sed do eiusmod
    tempor incididunt ut labore et dolore magna aliqua. Ut enim ad minim
    veniam, quis nostrud exercitation ullamco laboris nisi ut aliquip ex ea
    commodo consequat. Duis aute irure dolor in reprehenderit in voluptate
    velit esse cillum dolore eu fugiat nulla pariatur. Excepteur sint occaecat
    cupidatat non proident, sunt in culpa qui officia deserunt mollit anim id
    est laborum.
    '''
    pass


print foo.__doc__

1
প্রসেসিং ডকাস্ট্রিংগুলি ইতিমধ্যে পিইপি 257 তে বর্ণিত হিসাবে ধারাবাহিক ইনডেন্টেশন প্রক্রিয়া করতে হবে । ইতিমধ্যে সরঞ্জাম রয়েছে - যেমন inspect.cleandoc- এটি সঠিক উপায়ে করে।
bignose

0

আমার একই রকম সমস্যা হচ্ছে, কোডটি মাল্টিলিনগুলি ব্যবহার করে সত্যিই অপঠনযোগ্য হয়ে উঠেছে, আমি এরকম কিছু নিয়ে এসেছি

print("""aaaa
"""   """bbb
""")

হ্যাঁ, শুরুতে ভয়ানক লাগতে পারে তবে এম্বেড করা বাক্য গঠনটি বেশ জটিল ছিল এবং শেষে কিছু যুক্ত করা ('"n"' এর মতো) সমাধান হয়নি was


0

আপনি এই ফাংশনটি trim_indent ব্যবহার করতে পারেন ।

import re


def trim_indent(s: str):
    s = re.sub(r'^\n+', '', s)
    s = re.sub(r'\n+$', '', s)
    spaces = re.findall(r'^ +', s, flags=re.MULTILINE)
    if len(spaces) > 0 and len(re.findall(r'^[^\s]', s, flags=re.MULTILINE)) == 0:
        s = re.sub(r'^%s' % (min(spaces)), '', s, flags=re.MULTILINE)
    return s


print(trim_indent("""


        line one
            line two
                line three
            line two
        line one


"""))

ফলাফল:

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