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


1303

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

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

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

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

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

6
এই "Pythonic পথ তৈরি করা বহু-লাইন কোড একটি দীর্ঘ স্ট্রিং জন্য" একটি স্ট্রিং তৈরি করতে ধারণকারী নতুন লাইন দেখতে textwrap.dedent
বব স্টেইন

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

@ এসজার না, এটি কোনও এক্সওয়াই সমস্যা নয়, কোয়েরিটি যে কোনও ক্ষেত্রে একাধিক লাইনে সেরা বিন্যাসিত হবে। এসকিউএলই প্রশ্নের সাথে সম্পর্কিত নয়। বড় সাহসী সতর্কতাগুলি সম্পূর্ণ ন্যায়সঙ্গত :)
বাগম্যানট 123

আমি এ জন্য একটি ছোট প্যাকেজ লিখেছি। এখানে উদাহরণস্বরূপ: স্ট্যাকওভারফ্লো.com
শে

উত্তর:


2223

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

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

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

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

অর্থাত ,:

' 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 ...'

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


8
আমি দ্বিতীয় পদ্ধতির জন্য স্পষ্টভাবে "+" অপারেটরটি ব্যবহার করতে পছন্দ করি। খুব একটা ঝামেলা নয় এবং পাঠযোগ্যতার উন্নতি করে।
মার্কো সুলা

38
@ লুকাসমালোর সংলগ্ন স্ট্রিংগুলি একটি সংকলন-কাল কনটনেটেশন। +অপারেটরটি ব্যবহারের ফলে রানটাইমের সময় সংক্ষেপণ ঘটতে পারে না?
জোশুয়া টেলর

13
রেফারেন্সের জন্য, এখানে এই ঘটনার অফিসিয়াল ডক্স রয়েছে: ডকস.পাইথন.আর. / ২ / রেফারেন্স / ((পাইথন ২) এবং ডকস.পিথন.অর্গ / ৩ / রেফারেন্স/… (পাইথন ৩)
নেভেরেন্ডিংকস

4
আপনার উদাহরণটি ভাল, তবে আমি আশা করি এটিতে কীভাবে নিরাপদে এবং সুরক্ষিতভাবে ভেরিয়েবল ডেটা এম্বেড করা যায় তা প্রদর্শনের অন্তর্ভুক্ত ছিল। ওপি এবং @ জেসি উদাহরণ কোড উভয়ই সঠিকভাবে এটি কীভাবে করবেন না তা দেখায় (তারা এসকিউএল আক্রমণগুলির জন্য আমন্ত্রিত)। আরও দেখুন: dev.mysql.com/doc/connector-python/en/…
স্কট

2
আপনি textwrap.dedentঅযাচিত নেতৃস্থানীয় সাদা স্থান সরাতে ব্যবহার করতে পারেন। docs.python.org/3/library/textwrap.html#textwrap.dedent
কোরি গোল্ডবার্গ

189

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

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)

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


1
@ পাবলো আপনি এমনকি মন্তব্যগুলি যুক্ত করতে পারেন,
অশ্বিনী

@ 200OK আপনি মানে '?
কন সাইক

3
এই স্ট্রিংটি ফর্ম্যাট করার আরেকটি উপায় .format(...)হ'ল বন্ধ বন্ধনী পরে যুক্ত করা। %ফর্মেশন স্বরলিপি অবশ্যই কাজ করবে কিন্তু আমি এটি চেষ্টা করি নি
kon psych

3
নোট করুন যে প্রতিটি লাইন অবশ্যই একটি স্ট্রিং ধ্রুবক দিয়ে শেষ ' foo '+variableহবে , সুতরাং কাজ করবে না তবে ' foo '+variable+''হবে।
yoyo

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

138

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

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

9
আমি তিনটি উদ্ধৃতি স্বরলিপি বা to চরিত্রের () এর ভিতরে মোড়ানো পছন্দ করবো
খান হুয়া

14
আমি দৃ strongly়ভাবে নিম্নলিখিত লাইনের শেষের পরিবর্তে নিম্নলিখিত লাইনের শুরুতে স্পেসগুলি রাখার পরামর্শ দিচ্ছি। এইভাবে দুর্ঘটনাবশত একজন নিখোঁজ হওয়াই আরও সুস্পষ্ট and
Alfe

লাইনের শেষে ভেরিয়েবলগুলির সাথেও কাজ করেlongStr = "account: " + account_id + \ ...
frmbelz

আমি নিম্নলিখিত ত্রুটি the backslash is redundant between bracketsপাচ্ছি : যখন আমি ভিতরে লিখেছিলামprint()
আল্পার

50

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

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

30
একমত নন। প্রথম লাইনে ("স্ট্রিং = ...") ভারী চাপ থাকলে কী হবে? একটিকে নিম্নোক্ত রেখাগুলিকে শূন্য ইন্ডেন্টেশন করতে হবে, যা অন্যথায় ইন্টেন্টেড ব্লকের মাঝখানে কুৎসিত দেখাচ্ছে।
xjcl

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

1
আমি এই পদ্ধতির পছন্দ করি কারণ এটি পড়ার সুবিধার্থে। যেসব ক্ষেত্রে আমাদের দীর্ঘ পংক্তি রয়েছে সেখানে কোনও উপায় নেই ... আপনি যে ইনডেন্টেশন রয়েছেন তার উপর নির্ভর করে এবং এখনও প্রতি লাইনে 80 টি অক্ষর সীমাবদ্ধ ... ঠিক আছে ... আর কিছু বলার দরকার নেই। আমার দৃষ্টিতে পাইথন স্টাইলের গাইডগুলি এখনও খুব অস্পষ্ট। ধন্যবাদ!
এডুয়ার্ডো লুসিও

এই এত কুৎসিত যদি এটি একটি মডিউল অধীনে ব্যবহার করা হয় হবে, আমিও যেমন আছে.replace('\t','')
Alper

44

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

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

লেভন যা বলেছিলেন তা ভাল, তবে ভুলগুলির পক্ষে এটি অরক্ষিত হতে পারে:

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

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

8
+1 কোড-রিভিউরকে অপর্যাপ্ত সাদা জায়গার জন্য প্রতিটি লাইনের ডান প্রান্তটি সুনির্দিষ্টভাবে পরীক্ষা করা থেকে মুক্তি দেয় । ওপি এই ভুলটি বেশ কয়েকবার করেছে, যেমনটি @ ক্রোলিহোর্বাথ উল্লেখ করেছেন।
বব স্টেইন

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

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

1
@ চার্লসএডিসের সাথে সম্মত, কোড পর্যালোচনাগুলি স্বয়ংক্রিয় পদ্ধতিগুলির পরে যেমন লিন্ট, সিনট্যাক্স হাইলাইটিং ইত্যাদির পরে আসা উচিত However তবে কিছু সাদা-স্থান অনুপস্থিত বাগগুলি সেভাবে ধরা নাও পারে। বাগ থেকে রক্ষা করার জন্য সমস্ত যুক্তিসঙ্গত সুবিধাগুলি থেকে নিজেকে কাজে লাগান I
বব স্টেইন

33

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

foo = '1234'

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

সম্পাদনা: নামযুক্ত প্যারাম এবং। ফর্ম্যাট () সহ আরও একটি ভাল উপায় পাওয়া গেছে:

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)

26

এই পদ্ধতির ব্যবহার করে:

  • প্রাথমিক লাইনফিড এড়াতে কেবল একটি ব্যাকস্ল্যাশ
  • ট্রিপল উদ্ধৃত স্ট্রিং ব্যবহার করে প্রায় কোনও অভ্যন্তরীণ বিরামচিহ্ন নয়
  • পাঠ্য মোড়ক inspect মডিউলটি ব্যবহার করে স্থানীয় ইন্ডেন্টেশন সরিয়ে দেয়
  • পাইথন 3.6 বিন্যস্ত স্ট্রিং ক্ষেপক ( 'F') ব্যবহার করে account_idএবং def_idভেরিয়েবল।

এই উপায়টি আমার কাছে সর্বাধিক পাইথোনিক দেখায়।

# import textwrap  # See update to answer below
import inspect

# query = textwrap.dedent(f'''\
query = inspect.cleandoc(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}'''
)

আপডেট : 1/29/2019 inspect.cleandocপরিবর্তে ব্যবহার করার জন্য @ শ্যাডোএ্যাঞ্জারের পরামর্শ অন্তর্ভুক্ত করুনtextwrap.dedent


5
দ্রষ্টব্য: এর চেয়ে inspect.cleandocসামান্য সুন্দরtextwrap.dedent , কারণ এটির শেষে লাইন ধারাবাহিকতা অক্ষরের সাথে প্রথম লাইনটি খালি থাকার প্রয়োজন হয় না।
শেডোএ্যাঞ্জার

2
@ শ্যাডোএ্যাঞ্জার বাহ আমি আগে কখনও ক্ল্যানডোক ব্যবহার করিনি। আমি আমার উত্তর আপডেট করেছি এবং ভবিষ্যতে এটির inspect.cleandocজন্য ব্যবহার করব ।
ক্রিস্টোফার ব্রুনস

23

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

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}'''

4
যদি আমি বহু-লাইনের স্ট্রিংয়ের ফলাফল লগ করতে এবং বাম-পাশের ট্যাবগুলি / স্পেসগুলি না দেখায় তবে কীভাবে একটি এফ স্ট্রিং কাজ করবে?
কুয়ানব

7
এখনও এসকিউএল ইঞ্জেকশনের পক্ষে ঝুঁকিপূর্ণ
ট্রেন্টন

19

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

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'"

13

আমি এখানেtextwrap.dedent বর্ণিত দীর্ঘ স্ট্রিংয়ের জন্য সেরাটি পাই :

def create_snippet():
    code_snippet = textwrap.dedent("""\
        int main(int argc, char* argv[]) {
            return 0;
        }
    """)
    do_something(code_snippet)

1
আমি কালো স্ল্যাশ পছন্দ করি যা অটো নতুন লাইনে বাধা দেয়, অনেক ধন্যবাদ!
zyy

12

অন্যরা ইতিমধ্যে প্রথম বন্ধনী পদ্ধতি উল্লেখ করেছে, তবে আমি এটি যুক্ত করতে চাই যে বন্ধনীগুলির সাথে, ইনলাইন মন্তব্যের অনুমতি রয়েছে।

প্রতিটি খণ্ডে মন্তব্য:

nursery_rhyme = (
    'Mary had a little lamb,'          # Comments are great!
    'its fleece was white as snow.'
    'And everywhere that Mary went,'
    'her sheep would surely go.'       # What a pesky sheep.
)

ধারাবাহিকতার পরে মন্তব্য অনুমোদিত নয়:

ব্যাকস্ল্যাশ লাইনের ধারাবাহিকতা ( \) ব্যবহার করার সময় , মন্তব্যের অনুমতি দেওয়া হয় না। আপনি একটি SyntaxError: unexpected character after line continuation characterত্রুটি পাবেন ।

nursery_rhyme = 'Mary had a little lamb,' \  # These comments
    'its fleece was white as snow.'       \  # are invalid!
    'And everywhere that Mary went,'      \
    'her sheep would surely go.'
# => SyntaxError: unexpected character after line continuation character

রেজেক্স স্ট্রিংয়ের জন্য আরও ভাল মন্তব্য:

Https://docs.python.org/3/library/re.html#re.VERBOSE এর উদাহরণের ভিত্তিতে ,

a = re.compile(
    r'\d+'  # the integral part
    r'\.'   # the decimal point
    r'\d*'  # some fractional digits
)
# Using VERBOSE flag, IDE usually can't syntax highight the string comment.
a = re.compile(r"""\d +  # the integral part
                   \.    # the decimal point
                   \d *  # some fractional digits""", re.X)

10

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

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 উভয়ের সাথেই সামঞ্জস্যপূর্ণ (এটি সর্বোপরি পাইথোনিক)
  • কোনও স্ট্রিং কনটেনটেশন প্রয়োজন
  • প্রতিটি লাইনের ডান-সর্বাধিক অক্ষরটি একটি স্থান কিনা তা নিশ্চিত করার দরকার নেই

কনস

  • যেহেতু ক্যোয়ারীতে ভেরিয়েবলগুলি ?স্থানধারক দ্বারা প্রতিস্থাপন করা হয়েছে, কোয়েরিতে ?প্রচুর পরিমাণে পাইথন ভেরিয়েবলের দ্বারা কোনটি প্রতিস্থাপন করা উচিত তা ট্র্যাক করা সামান্য কঠিন হয়ে উঠতে পারে ।

দ্রষ্টব্য, আমি এটি পরীক্ষা করে দেখিনি, তবে আপনি সম্ভবত প্রাসঙ্গিক জায়গায় "{0} {1} {2}" প্রতিস্থাপন করে এবং তারপরে শেষ লাইনটি পরিবর্তন করে প্রশ্ন চিহ্ন বিভ্রান্তি এড়াতে পারবেন cursor.execute(query.format(vars))। এটি আপনার একমাত্র "কন" (আমি আশা করি) এর যত্ন নেওয়া উচিত।
বেন

হ্যাঁ, ব্যবহার করা দুর্দান্ত formatহবে তবে আমি নিশ্চিত নই যে ক্যোরি স্ট্রিংটি সেভাবে ফর্ম্যাট করে এসকিউএল ইঞ্জেকশন থেকে নিরাপদ হবে কিনা।
ফাহিল

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

2
@ যদি আপনি cursor.execute(query.format(vars))আর প্রস্তুত বিবৃতি থেকে লাভ না করেন তবে আপনি অনেক ধরণের সমস্যার ঝুঁকির মধ্যে রয়েছেন, প্যারামিটারগুলি যদি কেবল সংখ্যা না হয় তবে এসকিউএল কোয়েরিতে আপনাকে সেগুলি দ্বিগুণ করা দরকার ote
প্যাট্রিক মেভিজেক

4

আমি সাধারণত এই জাতীয় কিছু ব্যবহার করি:

text = '''
    This string was typed to be a demo
    on how could we write a multi-line
    text in Python.
'''

আপনি যদি প্রতিটি লাইনের বিরক্তিকর ফাঁকা স্থানগুলি সরাতে চান তবে আপনি নিম্নলিখিত হিসাবে এটি করতে পারেন:

text = '\n'.join(line.lstrip() for line in text.splitlines())

2
পাইথনের textwrap.dedentফাংশনটি দেখুন যা স্ট্যান্ডার্ড লাইব্রেরিতে রয়েছে এটির আপনার প্রয়োজনীয় কার্যকারিতা রয়েছে।
bjd2385

@ বিজেডি 2385: inspect.cleandocসামান্য সুন্দর
শ্যাডোর্যাঞ্জার

3

আপনার আসল কোডটি কাজ করা উচিত নয়, আপনি "রেখাগুলি" (যেমন role.descr as roleFROM...:) এর শেষে হোয়াইট স্পেসগুলি অনুপস্থিত are

মাল্টলাইন স্ট্রিংয়ের জন্য ট্রিপলকোটগুলি রয়েছে:

string = """line
  line2
  line3"""

এটিতে লাইন ব্রেক এবং অতিরিক্ত স্থানগুলি থাকবে তবে এসকিউএল এর জন্য এটি কোনও সমস্যা নয়।


3

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

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

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


3

"À লা" স্কেল উপায় (তবে আমি মনে করি ওকিউর দাবি অনুসারে সবচেয়ে অজগর উপায়):

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            | ',' ')`.

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


3

TL; ড: ব্যবহার """\এবং """স্ট্রিং মোড়ানো , হিসাবে

string = """\
This is a long string
spanning multiple lines.
"""

থেকে সরকারী পাইথন ডকুমেন্টেশন :

স্ট্রিং লিটারেলগুলি একাধিক লাইন বিস্তৃত করতে পারে। একটি উপায় ট্রিপল-কোট ব্যবহার করছে: "" "..." "" বা '' '...' ''। লাইনের শেষটি স্বয়ংক্রিয়ভাবে স্ট্রিংয়ে অন্তর্ভুক্ত হয় তবে লাইনের শেষে একটি adding যোগ করে এটি প্রতিরোধ করা সম্ভব। নিম্নলিখিত উদাহরণ:

print("""\
Usage: thingy [OPTIONS]
     -h                        Display this usage message
     -H hostname               Hostname to connect to
""")

নিম্নলিখিত আউটপুট উত্পাদন করে (লক্ষ্য করুন যে প্রাথমিক নিউলাইনটি অন্তর্ভুক্ত নয়):

Usage: thingy [OPTIONS]
     -h                        Display this usage message
     -H hostname               Hostname to connect to

2

আরে এই আশা মতো কাজ করার মতো কিছু চেষ্টা করুন, এই ফর্ম্যাটের মতো এটি আপনাকে একটি ধারাবাহিক রেখা ফিরিয়ে দেবে যেমন আপনি এই সম্পত্তি সম্পর্কে সফলভাবে অনুসন্ধান করেছেন `

"message": f'you have successfully inquired about '
           f'{enquiring_property.title} Property owned by '
           f'{enquiring_property.client}'

1

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

# 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)

পিএস: প্রয়োজনে এসকিউএল কোয়েরিগুলি প্রিন্ট করার জন্য দুর্দান্ত অজগর-স্ক্লোপার্স গ্রন্থাগারটি একবার দেখুন। http://sqlparse.readthedocs.org/en/latest/api/#sqlparse.format


"পুনরাবৃত্তি ফাংশন" যে ল্যাম্বডা বলা হয় না?
এম 3 এন্ড

1

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

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 

1

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

'''
Filename: practice.py
File creator: me
File purpose: explain triple quotes
'''


def example():
    """This prints a string that occupies multiple lines!!"""
    print("""
    This
    is 
    a multi-line
    string!
    """)

0

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

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
)
"""

0

থেকে সরকারী পাইথন ডকুমেন্টেশন :

স্ট্রিং লিটারেলগুলি একাধিক লাইন বিস্তৃত করতে পারে। একটি উপায় ট্রিপল-কোট ব্যবহার করছে: "" "..." "" বা '' '...' ''। লাইনের শেষটি স্বয়ংক্রিয়ভাবে স্ট্রিংয়ে অন্তর্ভুক্ত হয় তবে লাইনের শেষে একটি adding যোগ করে এটি প্রতিরোধ করা সম্ভব। নিম্নলিখিত উদাহরণ:

print("""\
Usage: thingy [OPTIONS]
     -h                        Display this usage message
     -H hostname               Hostname to connect to
""")

নিম্নলিখিত আউটপুট উত্পাদন করে (লক্ষ্য করুন যে প্রাথমিক নিউলাইনটি অন্তর্ভুক্ত নয়):


0

ডিকের ভিতরে দীর্ঘ স্ট্রিং সংজ্ঞায়িত করার জন্য, নিউলাইনগুলি রেখে তবে ফাঁকা জায়গা বাদ দেওয়ার জন্য , আমি স্ট্রিংটিকে এই ধ্রুবক হিসাবে সংজ্ঞায়িত করে শেষ করেছি:

LONG_STRING = \
"""
This is a long sting
that contains newlines.
The newlines are important.
"""

my_dict = {
   'foo': 'bar',
   'string': LONG_STRING
}

0

পাইথনে দীর্ঘ স্ট্রিংয়ের সাধারণ পদ্ধতির হিসাবে আপনি ট্রিপল কোট ব্যবহার করতে পারেন splitএবং join:

_str = ' '.join('''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.'''.split())

আউটপুট:

'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.'

কোনও এসকিউএল ক্যোয়ারী সম্পর্কিত ওপির প্রশ্ন সম্পর্কিত, নীচের উত্তরটি এসকিউএল কোয়েরি তৈরির ক্ষেত্রে এই পদ্ধতির যথাযথতা উপেক্ষা করে এবং অতিরিক্ত আমদানি ছাড়াই কেবল পঠনযোগ্য এবং নান্দনিক উপায়ে দীর্ঘ স্ট্রিং তৈরির উপর দৃষ্টি নিবদ্ধ করে। এটি গণ্যমানের বোঝাটিকেও এড়িয়ে যায়।

ট্রিপল কোটগুলি ব্যবহার করে আমরা একটি দীর্ঘ এবং পঠনযোগ্য স্ট্রিং তৈরি করি যা আমরা তারপরে একটি split()সাদা তালিকায় ছড়িয়ে দিয়ে একটি তালিকায় বিভক্ত হয় এবং তারপরে এটি আবার একসাথে যোগদান করি ' '.join()। অবশেষে আমরা format()কমান্ডটি ব্যবহার করে ভেরিয়েবলগুলি সন্নিবেশ করবো :

account_id = 123
def_id = 321

_str = '''
    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 = {}
    '''

query = ' '.join(_str.split()).format(account_id, account_id, def_id)

উত্পাদন:

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 = 123 AND record_def.account_id=123 AND def_id=321

সম্পাদনা করুন: এই পদ্ধতিটি PEP8 এর সাথে সামঞ্জস্যপূর্ণ নয় তবে আমি এটি সময়ে সময়ে দরকারী বলে মনে করি


-7

সাধারণত, আমি ব্যবহার করি 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' (নিউলাইন) বা ' ,' (কমা) বা ' ' (স্পেস) যোগ করতে কোনও স্ট্রিং ব্যবহার করতে পারেন

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


1
আপনি কেন অন্তত একটি অ্যারে আক্ষরিক ব্যবহার করবেন না?
আলেকজান্ডার - মনিকা 22 ই

1
অ্যারেগুলি শ্রেণি তালিকার দ্বারা প্রতিনিধিত্ব করা হয়। অ্যারে
আক্ষরিক

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