python - একটি দীর্ঘ মাল্টি লাইন স্ট্রিং তৈরি করতে পাইথনিক উপায়





string multiline multilinestring (17)


আপনি "" নোটেশন ব্যবহার করার সময় ভেরিয়েবল সংহত করতে পারেন:

foo = '1234'

long_string = """fosdl a sdlfklaskdf as
as df ajsdfj asdfa sld
a sdf alsdfl alsdfl """ +  foo + """ aks
asdkfkasdk fak"""

সম্পাদনা করুন: নামযুক্ত প্যারামিটার এবং .format () সহ আরও ভাল উপায় খুঁজে পেয়েছে:

body = """
<html>
<head>
</head>
<body>
    <p>Lorem ipsum.</p>
    <dl>
        <dt>Asdf:</dt>     <dd><a href="{link}">{name}</a></dd>
    </dl>
    </body>
</html>
""".format(
    link='http://www.asdf.com',
    name='Asdf',
)

print(body)

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

var long_string = 'some text not important. just garbage to' +
                  'illustrate my example';

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

query = 'SELECT action.descr as "action", '\
    'role.id as role_id,'\
    'role.descr as role'\
    'FROM '\
    'public.role_action_def,'\
    'public.role,'\
    'public.record_def, '\
    'public.action'\
    'WHERE role.id = role_action_def.role_id AND'\
    'record_def.id = role_action_def.def_id AND'\
    'action.id = role_action_def.action_id AND'\
    'role_action_def.account_id = ' + account_id + ' AND'\
    'record_def.account_id=' + account_id + ' AND'\
    'def_id=' + def_id



পাইথনে কাঁচা এসকিউএল ক্যোয়ারীগুলি লেখার জন্য আমি সর্বদাই সেরা (সহজ, নিরাপদ এবং পাইথনিক) উপায় খুঁজে পাচ্ছি, বিশেষত যখন পাইথনের sqlite3 মডিউল ব্যবহার করে:

query = '''
    SELECT
        action.descr as action,
        role.id as role_id,
        role.descr as role
    FROM
        public.role_action_def,
        public.role,
        public.record_def,
        public.action
    WHERE
        role.id = role_action_def.role_id
        AND record_def.id = role_action_def.def_id
        AND action.id = role_action_def.action_id
        AND role_action_def.account_id = ?
        AND record_def.account_id = ?
        AND def_id = ?
'''
vars = (account_id, account_id, def_id)   # a tuple of query variables
cursor.execute(query, vars)   # using Python's sqlite3 module

পেশাদাররা

  • শুকনো এবং সহজ কোড (পাইথনিক!)
  • এসকিউএল ইনজেকশন থেকে নিরাপদ
  • পাইথন 2 এবং পাইথন 3 এর সাথে সামঞ্জস্যপূর্ণ (এটি সব পরে পাইথনিক)
  • কোন স্ট্রিং concatenation প্রয়োজন
  • প্রতিটি লাইন ডান-সবচেয়ে চরিত্র একটি স্থান নিশ্চিত করার প্রয়োজন নেই

কনস

  • যেহেতু ক্যোয়ারী পরিবর্তনশীল দ্বারা প্রতিস্থাপিত হয় ? স্থানধারক, এটি ট্র্যাক রাখা একটু কঠিন হতে পারে ? পাইথন পরিবর্তনশীল দ্বারা ক্যোয়ারী তাদের প্রচুর আছে যখন প্রতিস্থাপন করা হয়।



আমি এই পদ্ধতির পছন্দ কারণ এটি পড়ার অধিকার। যেখানে আমরা দীর্ঘ স্ট্রিং আছে সেখানে কোন উপায় নেই! ইন্ডেন্টেশন স্তরের উপর নির্ভর করে আপনি এখনও আছেন এবং এখনও প্রতি লাইনে 80 অক্ষর সীমাবদ্ধ ... ওয়েল ... অন্য কিছু বলার দরকার নেই। আমার দৃষ্টিতে পাইথন স্টাইল গাইড এখনও খুব অস্পষ্ট। আমি @Eero Altonen পদ্ধতিটি গ্রহণ করেছি কারণ এটি বিশেষভাবে পড়া এবং সাধারণ জ্ঞান। আমি শৈলী গাইড আমাদের সাহায্য করতে হবে এবং আমাদের জীবন একটি জগাখিচুড়ি করা উচিত বুঝতে। ধন্যবাদ!

class ClassName():
    def method_name():
        if condition_0:
            if condition_1:
                if condition_2:
                    some_variable_0 =\
"""
some_js_func_call(
    undefined, 
    {
        'some_attr_0': 'value_0', 
        'some_attr_1': 'value_1', 
        'some_attr_2': '""" + some_variable_1 + """'
    }, 
    undefined, 
    undefined, 
    true
)
"""



এই পদ্ধতিটি একটি প্রাথমিক লাইনফিড ব্যবহার করার জন্য কেবল একটি অভ্যন্তরীণ বিরামচিহ্ন এড়ানোর জন্য কেবল একটি ব্যাকস্ল্যাশ ব্যবহার করে, একটি ট্রিপল উদ্ধৃত স্ট্রিং ব্যবহার করে প্রায় অভ্যন্তরীণ বিরামচিহ্নটি ব্যবহার করে, পাঠ্যক্রমের মডিউল ব্যবহার করে স্থানীয় ইন্ডেন্টেশনটিকে account_id এবং def_id এবং def_id জন্য পাইথন 3.6 ফর্ম্যাটযুক্ত স্ট্রিং ইন্টারপোলেশন ('f') ব্যবহার করে। ভেরিয়েবল। এই ভাবে আমার সবচেয়ে পাইথনিক দেখায়।

import textwrap

query = textwrap.dedent(f'''\
    SELECT action.descr as "action", 
    role.id as role_id,
    role.descr as role
    FROM 
    public.role_action_def,
    public.role,
    public.record_def, 
    public.action
    WHERE role.id = role_action_def.role_id AND
    record_def.id = role_action_def.def_id AND
    action.id = role_action_def.action_id AND
    role_action_def.account_id = {account_id} AND
    record_def.account_id={account_id} AND
    def_id={def_id}'''
)



আমার জন্য কাজ করে লাইন ব্রেকিং। এখানে একটি উদাহরণ:

longStr = "This is a very long string " \
        "that I wrote to help somebody " \
        "who had a question about " \
        "writing long strings in Python"



আপনি যদি মাল্টিলাইন স্ট্রিংটি না চান তবে শুধুমাত্র একটি লং একক লাইন স্ট্রিং থাকে তবে আপনি বন্ধনী ব্যবহার করতে পারেন, কেবল স্ট্রিং সেগমেন্টগুলির মধ্যে কমাগুলি অন্তর্ভুক্ত করবেন না তা নিশ্চিত করুন, এটি একটি টিপল হবে।

query = ('SELECT   action.descr as "action", '
         'role.id as role_id,'
         'role.descr as role'
         ' FROM '
         'public.role_action_def,'
         'public.role,'
         'public.record_def, '
         'public.action'
         ' WHERE role.id = role_action_def.role_id AND'
         ' record_def.id = role_action_def.def_id AND'
         ' action.id = role_action_def.action_id AND'
         ' role_action_def.account_id = '+account_id+' AND'
         ' record_def.account_id='+account_id+' AND'
         ' def_id='+def_id)

এসকিউএল স্টেটমেন্টে আপনি যা তৈরি করছেন তার মতো, মাল্টিলাইন স্ট্রিংও ভাল হবে। তবে যদি অতিরিক্ত হোয়াইটস্পেসটি একটি মাল্টিলাইন স্ট্রিং ধারণ করে তবে এটি একটি সমস্যা হবে, তাহলে এটি আপনার পক্ষে যা অর্জন করতে হবে তা অর্জনের একটি ভাল উপায়।




জটিল জটিল এসকিউএল ক্যোয়ারী তৈরি করতে আমি একটি পুনরাবৃত্তিমূলক ফাংশন ব্যবহার করি। কোড পঠনযোগ্যতা বজায় রাখার সময় এই কৌশলটি সাধারণত বড় স্ট্রিংগুলি তৈরি করতে ব্যবহার করা যেতে পারে।

# Utility function to recursively resolve SQL statements.
# CAUTION: Use this function carefully, Pass correct SQL parameters {},
# TODO: This should never happen but check for infinite loops
def resolveSQL(sql_seed, sqlparams):
    sql = sql_seed % (sqlparams)
    if sql == sql_seed:
        return ' '.join([x.strip() for x in sql.split()])
    else:
        return resolveSQL(sql, sqlparams)

পিএস: যদি প্রয়োজন হয় চমত্কার মুদ্রণ এসকিউএল প্রশ্ন থেকে সন্ত্রস্ত python-sqlparse লাইব্রেরি একটি বর্ণন আছে। http://sqlparse.readthedocs.org/en/latest/api/#sqlparse.format




আমি এই এক সঙ্গে নিজেকে খুশি পাওয়া:

string = """This is a
very long string,
containing commas,
that I split up
for readability""".replace('\n',' ')



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

s = """ this is a very
        long string if I had the
        energy to type more and more ..."""

আপনি একক উদ্ধৃতিও ব্যবহার করতে পারেন (অবশ্যই শুরু এবং শেষের মধ্যে 3 টি) এবং ফলাফলের স্ট্রিংগুলিকে ঠিক কোনও স্ট্রিংয়ের মতো আচরণ করুন।

দ্রষ্টব্য : ঠিক যেমন কোনও স্ট্রিং সহ, শুরু এবং শেষ কোটগুলির মধ্যে কিছু স্ট্রিংটির অংশ হয়ে যায়, তাই এই উদাহরণটিতে একটি নেতৃস্থানীয় ফাঁকা (@ root45 দ্বারা নির্দেশিত) রয়েছে। এই স্ট্রিং উভয় খালি এবং newlines থাকতে হবে।

অর্থাত ,:

' this is a very\n        long string if I had the\n        energy to type more and more ...'

অবশেষে, পাইথনটিতে দীর্ঘ লাইনেও লাইন তৈরি করা যেতে পারে:

 s = ("this is a very"
      "long string too"
      "for sure ..."
     )

যা কোনও অতিরিক্ত স্থান বা নতুন লাইন অন্তর্ভুক্ত করবে না (এটি একটি ইচ্ছাকৃত উদাহরণ যা দেখানো হয়েছে যে বাদ দেওয়ার স্থানগুলি কী প্রভাব ফেলবে):

'this is a verylong string toofor sure ...'

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




উদাহরণ স্বরূপ:

sql = ("select field1, field2, field3, field4 "
       "from table "
       "where condition1={} "
       "and condition2={}").format(1, 2)

Output: 'select field1, field2, field3, field4 from table 
         where condition1=1 and condition2=2'

যদি শর্ত মান একটি স্ট্রিং হওয়া উচিত, আপনি এটি করতে পারেন:

sql = ("select field1, field2, field3, field4 "
       "from table "
       "where condition1='{0}' "
       "and condition2='{1}'").format('2016-10-12', '2017-10-12')

Output: "select field1, field2, field3, field4 from table where
         condition1='2016-10-12' and condition2='2017-10-12'"



"À লা" স্কাল পথ (কিন্তু আমি মনে করি OQ দাবি হিসাবে সবচেয়ে pythonic উপায়):

description = """
            | The intention of this module is to provide a method to 
            | pass meta information in markdown_ header files for 
            | using it in jinja_ templates. 
            | 
            | Also, to provide a method to use markdown files as jinja 
            | templates. Maybe you prefer to see the code than 
            | to install it.""".replace('\n            | \n','\n').replace('            | ',' ')

যদি আপনি লাফ লাইন ছাড়াই চূড়ান্ত স্ট্রাকে চান তবে দ্বিতীয় প্রতিস্থাপনের প্রথম যুক্তিটির শুরুতে \n :

.replace('\n            | ',' ')`.

নোট: "... টেম্পলেটস" এর মধ্যে সাদা লাইন। এবং "এছাড়াও, ..." | পরে একটি হোয়াইটস্পেস প্রয়োজন ।




সাধারণত, আমি list ব্যবহার করি এবং মাল্টি-লাইন মন্তব্য / স্ট্রিংয়ের জন্য join করি।

lines = list()
lines.append('SELECT action.enter code here descr as "action", ')
lines.append('role.id as role_id,')
lines.append('role.descr as role')
lines.append('FROM ')
lines.append('public.role_action_def,')
lines.append('public.role,')
lines.append('public.record_def, ')
lines.append('public.action')
query = " ".join(lines)

আপনি এই তালিকার সমস্ত উপাদান যোগ করতে ' \n ' (newline) বা ' , ' (কমা) বা ' '(স্থান)

চিয়ার্স .. !!




আপনি SQL ফাইলটি একটি পৃথক ফাইল action.sql এও স্থাপন করতে পারেন এবং এটি py ফাইলে লোড করতে পারেন

with open('action.sql') as f:
   query = f.read()

তাই এসকিউএল-স্টেটমেন্ট পাইথন কোড থেকে পৃথক করা হবে। এসকিউএল স্টেটমেন্টের প্যারামিটারগুলি যদি পিয়থন থেকে পূরণ করা প্রয়োজন হয় তবে আপনি স্ট্রিং ফর্ম্যাটিং ব্যবহার করতে পারেন (যেমন% s বা {field})




পাইথন> = 3.6 এ আপনি ফরম্যাটযুক্ত স্ট্রিং লিটারেল (f স্ট্রিং) ব্যবহার করতে পারেন

query= f'''SELECT   action.descr as "action"
    role.id as role_id,
    role.descr as role
    FROM
    public.role_action_def,
    public.role,
    public.record_def,
    public.action
    WHERE role.id = role_action_def.role_id AND
    record_def.id = role_action_def.def_id AND
    action.id = role_action_def.action_id AND
    role_action_def.account_id = {account_id} AND
    record_def.account_id = {account_id} AND
    def_id = {def_id}'''



কোডটি (যেমন ভেরিয়েবল) ইন্ডেন্ট হওয়া অবস্থায় অন্য একটি বিকল্পটি আরও বেশি পঠনযোগ্য এবং আউটপুট স্ট্রিংটি এক লাইনার (কোন নতুন লাইন) হওয়া উচিত নয়:

def some_method():

    long_string = """
a presumptuous long string 
which looks a bit nicer 
in a text editor when
written over multiple lines
""".strip('\n').replace('\n', ' ')

    return long_string 



আমি দেখেছি যে দীর্ঘ স্ট্রিংগুলি তৈরি করার সময়, আপনি সাধারণত এসকিউএল ক্যোয়ারী তৈরি করার মতো কিছু করছেন, এ ক্ষেত্রে এটি সেরা:

query = ' '.join((  # note double parens, join() takes an iterable
    "SELECT foo",
    "FROM bar",
    "WHERE baz",
))

কি Levon প্রস্তাব ভাল, কিন্তু ভুল দুর্বল হতে পারে:

query = (
    "SELECT foo"
    "FROM bar"
    "WHERE baz"
)

query == "SELECT fooFROM barWHERE baz"  # probably not what you want



এটি কেবল একটি string.find("substring") অনুসন্ধান যদি আপনি string.find("substring") ব্যবহার করতে পারেন।

find , index , এবং যদিও, তারা সাবস্ক্রাইব অনুসন্ধান হিসাবে in একটু সতর্কতা অবলম্বন করা আছে। অন্য কথায়, এই:

s = "This be a string"
if s.find("is") == -1:
    print "No 'is' here!"
else:
    print "Found 'is' in the string."

এটি Found 'is' in the string. প্রিন্ট হবে Found 'is' in the string. একইভাবে, if "is" in s: True মূল্যায়ন করা হবে। এই আপনি চান বা হতে পারে না।





python string multiline multilinestring