Saya memiliki query yang sangat panjang. Saya ingin membaginya dalam beberapa baris di Python. Cara untuk melakukannya dalam JavaScript akan menggunakan beberapa kalimat dan bergabung dengan mereka dengan +
operator (aku tahu, mungkin itu's tidak cara yang paling efisien untuk melakukannya, tapi aku'm tidak benar-benar peduli tentang kinerja dalam tahap ini, hanya kode yang mudah dibaca). Contoh:
var long_string = 'some text not important. just garbage to' +
'illustrate my example';
Saya mencoba melakukan sesuatu yang serupa di Python, tapi itu tidak't bekerja, jadi saya menggunakan \
untuk membagi string panjang. Namun, saya'm tidak yakin jika ini adalah satu-satunya/terbaik/pythonicest cara untuk melakukannya. Hal ini terlihat canggung.
Sebenarnya kode:
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
Apakah anda berbicara tentang multi-line string? Mudah, menggunakan tiga tanda kutip untuk memulai dan mengakhiri mereka.
s = """ this is a very
long string if I had the
energy to type more and more ..."""
Anda dapat menggunakan tanda kutip tunggal juga (3 dari mereka tentu saja pada awal dan akhir) dan memperlakukan string yang dihasilkan s
seperti string.
CATATAN: Hanya dengan string apa pun, apa pun antara awal dan akhir kutipan menjadi bagian dari string, jadi contoh ini telah terkemuka kosong (seperti yang ditunjukkan oleh @root45). String ini juga akan berisi kosong dan baris baru.
I. e.,:
' this is a very\n long string if I had the\n energy to type more and more ...'
Akhirnya, kita juga dapat membangun garis panjang di Python seperti ini:
s = ("this is a very"
"long string too"
"for sure ..."
)
yang akan tidak termasuk tambahan kosong atau baris baru (ini adalah disengaja contoh yang menunjukkan apa efek skipping kosong akan mengakibatkan):
'this is a verylong string toofor sure ...'
Tidak ada koma yang diperlukan, hanya menempatkan string yang akan bergabung bersama-sama ke dalam sepasang kurung dan pastikan untuk memperhitungkan setiap diperlukan kosong dan baris baru.
Jika anda don't ingin string multiline tetapi hanya memiliki panjang satu baris string, anda dapat menggunakan tanda kurung, pastikan anda don't termasuk koma antara string segmen, maka itu akan menjadi sebuah tuple.
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)
Dalam sebuah pernyataan SQL seperti apa yang anda're membangun, multiline string juga akan baik-baik saja. Tapi jika spasi tambahan multiline string akan berisi akan menjadi masalah, maka ini akan menjadi cara yang baik untuk mencapai apa yang anda inginkan.
Saya menemukan bahwa ketika bangunan lama string, biasanya anda akan melakukan sesuatu seperti membangun sebuah query SQL, dalam hal ini yang terbaik adalah:
query = ' '.join(( # note double parens, join() takes an iterable
"SELECT foo",
"FROM bar",
"WHERE baz",
))
Apa yang Levon menyarankan lebih baik, tapi mungkin rentan terhadap kesalahan:
query = (
"SELECT foo"
"FROM bar"
"WHERE baz"
)
query == "SELECT fooFROM barWHERE baz" # probably not what you want
Anda juga dapat menggabungkan variabel dalam ketika menggunakan """ notasi:
foo = '1234'
long_string = """fosdl a sdlfklaskdf as
as df ajsdfj asdfa sld
a sdf alsdfl alsdfl """ + foo + """ aks
asdkfkasdk fak"""
EDIT: Ditemukan cara yang lebih baik, dengan bernama params dan .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)
Di Python >= 3.6 anda dapat menggunakan Diformat string literal (f string)
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}'''
Pendekatan ini menggunakan:
memeriksa
modulaccount_id
dan def_id
variabel. Cara ini terlihat paling pythonic untuk saya.
# 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}'''
)
Update: 1/29/2019 Menggabungkan @ShadowRanger's saran untuk menggunakan memeriksa.cleandoc
bukan textwrap.dedent
Misalnya:
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'
jika nilai dari kondisi harus string, anda dapat melakukannya seperti ini:
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'"
Saya pribadi menemukan berikut untuk menjadi yang terbaik (sederhana, aman dan Pythonic) cara untuk menulis raw query SQL di Python, terutama ketika menggunakan Python's sqlite3 modul:
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
?
placeholder, hal itu dapat menjadi sedikit sulit untuk melacak dari mana ?
harus diganti dengan yang Python variabel ketika ada banyak dari mereka dalam query.Orang lain telah disebutkan dalam kurung metode sudah, tapi aku'd ingin menambahkan bahwa dengan tanda kurung, inline komentar yang diizinkan.
python nursery_rhyme = ( 'Mary had a little lamb,' # Komentar besar! 'bulu nya putih seperti salju.' 'Dan di mana-mana bahwa Maria pergi,' 'domba-domba mereka pasti akan pergi.' # Apa yang sial domba. )
Ketika menggunakan backslash baris kelanjutan (\
), komentar tidak diperbolehkan. Anda'll menerima SyntaxError: unexpected character setelah garis kelanjutan karakter
kesalahan.
`` nursery_rhyme = 'Mary had a little lamb,' \ # komentar-komentar Ini 'bulu nya putih seperti salju.' \ # yang tidak valid! 'Dan di mana-mana bahwa Maria pergi,' \ 'domba-domba mereka pasti akan pergi.'
``
Berdasarkan contoh dari https://docs.python.org/3/library/re.html#re.VERBOSE,
a = re.mengkompilasi( r'\d+' # bagian integral r'\.' # titik desimal r'\d*' # beberapa digit pecahan )
``
a = re.mengkompilasi(r"""\d + # bagian integral . # titik desimal \d * # beberapa digit pecahan""", re.X) ``
Saya biasanya menggunakan sesuatu seperti ini:
text = '''
This string was typed to be a demo
on how could we write a multi-line
text in Python.
'''
Jika anda ingin menghapus mengganggu ruang kosong di setiap baris, anda bisa melakukan sebagai berikut:
text = '\n'.join(line.lstrip() for line in text.splitlines())
Anda sebenarnya kode seharusnya't bekerja, anda akan kehilangan spasi putih di ujung "garis" (misalnya: peran.descr sebagai roleFROM...
)
Ada triplequotes untuk multiline string:
string = """line
line2
line3"""
Ini akan berisi baris dan spasi tambahan, tapi untuk SQL yang's tidak masalah.
",À la" Scala cara (tapi saya pikir adalah yang paling pythonic cara sebagai OQ tuntutan):
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(' | ',' ')
Jika anda ingin akhir str tanpa melompat garis, hanya menempatkan \n
di mulai dari argumen pertama dari kedua menggantikan:
.replace('\n | ',' ')`.
Catatan: garis putih antara "...template." dan "Juga, ..." membutuhkan spasi setelah |
.
Anda juga dapat menempatkan sql-pernyataan dalam sebuah file terpisah tindakan.sql
dan beban dalam py file dengan
with open('action.sql') as f:
query = f.read()
Jadi sql-pernyataan yang akan dipisahkan dari kode python. Jika ada parameter dalam pernyataan sql yang perlu diisi dari python, anda dapat menggunakan string format (seperti %s atau {medan})
Saya menggunakan fungsi rekursif untuk membangun kompleks Query SQL. Teknik ini umumnya dapat digunakan untuk membangun string besar dengan tetap menjaga kode mudah dibaca.
# 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)
P. S: silahkan lihat pada mengagumkan python-sqlparse perpustakaan cukup untuk mencetak query SQL jika diperlukan. http://sqlparse.readthedocs.org/en/latest/api/#sqlparse.format
Pilihan lain yang menurut saya lebih mudah dibaca ketika kode (e.g variable) adalah menjorok dan output string harus menjadi salah satu kapal (tidak ada baris baru):
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
tl;dr: Gunakan """\
dan """
untuk membungkus string, seperti pada
string = """\ Ini adalah panjang string mencakup beberapa baris. """
Dari resmi python dokumentasi:
String literals dapat menjangkau beberapa baris. Salah satu cara adalah dengan menggunakan triple-quotes: """...""" atau '''...'''. Akhir baris secara otomatis termasuk dalam string, tapi itu mungkin untuk mencegah hal ini dengan menambahkan \ di akhir baris. Contoh berikut ini:
print("""\ Penggunaan: thingy [OPSI] -Tampilan jam ini penggunaan pesan -H hostname Hostname untuk terhubung ke """)
menghasilkan output sebagai berikut (perhatikan bahwa awal baris tidak termasuk):
Penggunaan: thingy [OPSI] -Tampilan jam ini penggunaan pesan -H hostname Hostname untuk terhubung ke
Saya menyukai pendekatan ini karena keistimewaan membaca. Dalam kasus-kasus di mana kita memiliki panjang string tidak ada cara! Tergantung pada tingkat indentasi anda berada di dan masih terbatas untuk 80 karakter per baris... Yah... Tidak perlu mengatakan apa-apa lagi. Dalam pandangan saya python panduan gaya masih sangat samar-samar. Aku mengambil @Eero Aaltonen pendekatan karena itu hak membaca dan akal sehat. Saya memahami bahwa gaya panduan yang akan membantu kita dan tidak membuat hidup kita berantakan. Terima kasih!!!
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
)
"""