Cách Pythonic để tạo một chuỗi nhiều dòng dài


1306

Tôi có một truy vấn rất dài. Tôi muốn chia nó thành nhiều dòng trong Python. Một cách để làm điều đó trong JavaScript sẽ là sử dụng một số câu và nối chúng với một +toán tử (tôi biết, có thể đó không phải là cách hiệu quả nhất để làm điều đó, nhưng tôi không thực sự quan tâm đến hiệu suất trong giai đoạn này, chỉ là khả năng đọc mã) . Thí dụ:

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

Tôi đã thử làm một cái gì đó tương tự trong Python, nhưng nó không hoạt động, vì vậy tôi đã sử dụng \để tách chuỗi dài. Tuy nhiên, tôi không chắc đây có phải là cách duy nhất / tốt nhất / pythonicest không. Có vẻ lúng túng. Mã thực tế:

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
Vì ví dụ của bạn trông giống như một khối SQL chỉ chờ một cuộc tấn công tiêm chích, một đề xuất khác là xem xét một thư viện SQL cấp cao hơn như SQLAlchemy hoặc một cái gì đó để tránh khỏi việc hack cùng một SQL thô như thế này. (Có lẽ ngoài chủ đề, nhưng bạn đã yêu cầu "Bất kỳ đề xuất nào"
;;

6
Đây là "Cách Pythonic để tạo mã nhiều dòng cho một chuỗi dài" Để tạo một chuỗi chứa các dòng mới, hãy xem textwrap.dedent .
Bob Stein

8
@cezar Tôi đã viết câu hỏi này hơn năm năm trước, nhưng tôi nhớ nó phát sinh từ việc không biết cách đặt đúng truy vấn sql dài trong một vài dòng. Tôi đồng ý rằng tôi đã làm những điều ngu ngốc với chuỗi dài đó, nhưng đó không phải là câu hỏi của tôi và tôi không đủ thông minh để tìm một ví dụ tốt hơn để minh họa nó không bao gồm một số lo ngại về việc tiêm sql.
Pablo Mescher

@cezar không, đây không phải là vấn đề XY, truy vấn sẽ được định dạng tốt nhất trong nhiều dòng trong mọi trường hợp. SQLi không liên quan đến câu hỏi trong tầm tay. Tuy nhiên, cảnh báo táo bạo lớn là hoàn toàn hợp lý :)
bugmenot123

Tôi đã viết một gói nhỏ cho việc này. Ví dụ ở đây: stackoverflow.com/a/56940938/1842491
Shay

Câu trả lời:


2228

Bạn đang nói về chuỗi nhiều dòng? Dễ dàng, sử dụng ba dấu ngoặc kép để bắt đầu và kết thúc chúng.

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

Bạn cũng có thể sử dụng các trích dẫn đơn (tất nhiên 3 trong số chúng ở đầu và cuối) và coi chuỗi kết quả sgiống như bất kỳ chuỗi nào khác.

LƯU Ý : Giống như với bất kỳ chuỗi nào, mọi thứ giữa dấu ngoặc kép bắt đầu và kết thúc đều trở thành một phần của chuỗi, vì vậy ví dụ này có khoảng trống hàng đầu (như được chỉ ra bởi @ root45). Chuỗi này cũng sẽ chứa cả khoảng trống và dòng mới.

I E,:

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

Cuối cùng, người ta cũng có thể xây dựng các dòng dài trong Python như thế này:

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

trong đó sẽ không bao gồm bất kỳ khoảng trống hoặc dòng mới nào (đây là một ví dụ có chủ ý cho thấy hiệu ứng của việc bỏ trống sẽ dẫn đến kết quả gì):

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

Không yêu cầu dấu phẩy, chỉ cần đặt các chuỗi được nối với nhau thành một cặp dấu ngoặc đơn và đảm bảo tính đến mọi khoảng trống và dòng mới cần thiết.


8
Tôi thích sử dụng rõ ràng toán tử "+" cho phương thức thứ hai. Không có nhiều rắc rối và cải thiện khả năng đọc.
Marco Sulla

38
@LucasMalor Các chuỗi liền kề là một phép nối thời gian biên dịch. Không sử dụng +toán tử làm cho việc ghép nối xảy ra trong thời gian chạy?
Joshua Taylor

13
Để tham khảo, đây là các tài liệu chính thức cho hiện tượng này: docs.python.org/2/reference/, (python 2) và docs.python.org/3/reference/ trộm (python 3)
neverendingqs

4
Ví dụ của bạn là tốt, nhưng tôi ước nó đã bao gồm việc trình bày cách nhúng dữ liệu biến an toàn và an toàn vào truy vấn. Cả mã ví dụ OP và @jessee đều chỉ ra cách KHÔNG thực hiện chính xác (chúng là lời mời tham gia các cuộc tấn công SQL). Xem thêm: dev.mysql.com/doc/connector-python/en/ Kẻ
Scott Prive

2
bạn có thể sử dụng textwrap.dedentđể loại bỏ khoảng trắng hàng đầu không mong muốn. docs.python.org/3/l Library / textwrap.html
Corey Goldberg

190

Nếu bạn không muốn một chuỗi nhiều dòng nhưng chỉ có một chuỗi dòng đơn dài, bạn có thể sử dụng dấu ngoặc đơn, chỉ cần đảm bảo rằng bạn không bao gồm dấu phẩy giữa các phân đoạn chuỗi, sau đó sẽ là một 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)

Trong một câu lệnh SQL giống như những gì bạn đang xây dựng, các chuỗi nhiều dòng cũng sẽ ổn. Nhưng nếu khoảng trắng thêm một chuỗi nhiều dòng sẽ là một vấn đề, thì đây sẽ là một cách tốt để đạt được những gì bạn muốn.


1
@Pablo bạn thậm chí có thể thêm nhận xét sau,
Ashwini Chaudhary

@ 200OK ý bạn là 'gì sau ?
kon tâm lý

3
Một cách khác để định dạng chuỗi này sẽ là thêm .format(...)sau dấu ngoặc đơn đóng. %ký hiệu hình thành cũng phải hoạt động nhưng tôi đã không thử nó
kon psych

3
Lưu ý rằng mỗi dòng phải kết thúc bằng một chuỗi hằng, vì vậy ' foo '+variablesẽ không hoạt động, nhưng ' foo '+variable+''sẽ.
yoyo

46
Ví dụ này là một cánh cửa mở cho các cuộc tấn công tiêm nhiễm SQL. Xin vui lòng, không ai sử dụng điều này trên bất kỳ ứng dụng nào. Xem tài liệu MySQL để biết cách sử dụng 'giữ chỗ': dev.mysql.com/doc/connector-python/en/ Kẻ
Scott Prive

138

Phá vỡ dòng bằng cách \làm việc cho tôi. Đây là một ví dụ:

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

9
Tôi thích ký hiệu trích dẫn ba hoặc gói bên trong () cho ký tự \
Khánh Hua

15
Tôi thực sự khuyên bạn nên đặt khoảng trắng ở đầu các dòng sau thay vì ở cuối các dòng tiếp theo. Cách này vô tình thiếu một cách rõ ràng hơn (và do đó ít có khả năng xảy ra).
Alfe

Cũng hoạt động với các biến ở cuối dònglongStr = "account: " + account_id + \ ...
frmbelz

Tôi nhận được lỗi sau: the backslash is redundant between bracketskhi tôi viết vào bên trongprint()
vào

50

Tôi thấy mình hạnh phúc với điều này:

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

32
Không đồng ý. Điều gì xảy ra nếu dòng đầu tiên ("chuỗi = ...") bị thụt vào nhiều? Người ta sẽ phải khử các dòng sau thành không thụt vào, trông xấu xí ở giữa một khối thụt khác.
xjcl

1
Chà, phần lớn các chuỗi dài của tôi xảy ra ở cấp độ mô-đun, nơi điều này rất phù hợp. Trong trường hợp của bạn mặc dù điều này rõ ràng sẽ không phải là giải pháp tốt nhất.
Eero Aaltonen

1
Tôi thích cách tiếp cận này vì nó đặc quyền đọc. Trong trường hợp chúng ta có chuỗi dài thì không có cách nào ... Tùy thuộc vào mức độ thụt lề mà bạn đang ở và vẫn bị giới hạn ở 80 ký tự trên mỗi dòng ... Chà ... Không cần phải nói gì thêm. Theo quan điểm của tôi, hướng dẫn phong cách python vẫn còn rất mơ hồ. Cảm ơn!
Eduardo Lucio

Điều này sẽ rất xấu nếu nó được sử dụng theo một mô-đun, tôi cũng phải như vậy.replace('\t','')
kể từ

44

Tôi thấy rằng khi xây dựng chuỗi dài, bạn thường làm một việc gì đó như xây dựng truy vấn SQL, trong trường hợp này là tốt nhất:

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

Những gì Levon đề xuất là tốt, nhưng có thể dễ bị mắc lỗi:

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

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

8
+1 Giúp người kiểm tra mã không phải kiểm tra một cách cẩn thận phần cuối bên phải của mỗi dòng để có khoảng trắng không đầy đủ . OP đã phạm lỗi này nhiều lần, như được ghi nhận bởi @KarolyHorvath.
Bob Stein

2
Khi xem xét các chuỗi đa dòng được mã hóa theo kiểu tương tự, tôi yêu cầu khoảng trắng đầy đủ ở đầu bên trái của mỗi dòng để xác nhận dễ dàng.
Ô

3
@ BobStein-VisiBone Mã đánh giá không nên về lỗi cú pháp hoặc lỗi nhỏ như thế này, chúng nên là về chất. Nếu ai đó đang đưa mã lên để xem xét có lỗi cú pháp (và do đó sẽ không chạy cả hoặc trong một số tình huống nhất định) thì có gì đó sai nghiêm trọng. Không khó để chạy lint trước khi bạn cam kết. Nếu người đó không nhận thấy chương trình của họ không chạy chính xác vì họ đã phạm một lỗi rõ ràng như vậy, họ không nên cam kết.
Charles Addis

1
Đồng ý @CharlesAddis, đánh giá mã phải được đưa ra sau các phương thức tự động, ví dụ như lint, tô sáng cú pháp, v.v. Tuy nhiên, một số lỗi thiếu khoảng trắng có thể không bị bắt theo cách đó. Tận dụng tất cả các lợi thế hợp lý trong việc bảo vệ chống lại lỗi, tôi đề nghị.
Bob Stein

33

Bạn cũng có thể nối các biến khi sử dụng ký hiệu "" ":

foo = '1234'

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

EDIT: Tìm thấy một cách tốt hơn, với params và .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)

26

Cách tiếp cận này sử dụng:

  • chỉ cần một dấu gạch chéo ngược để tránh một nguồn cấp dữ liệu ban đầu
  • hầu như không có dấu câu nội bộ bằng cách sử dụng chuỗi trích dẫn ba
  • loại bỏ thụt cục bộ bằng cách sử dụng mô-đun textwrap inspect
  • sử dụng phép nội suy chuỗi định dạng python 3.6 ('f') cho các biến account_iddef_id.

Cách này có vẻ là pythonic nhất đối với tôi.

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

Cập nhật : 1/29/2019 Kết hợp đề xuất @ ShadowRanger để sử dụng inspect.cleandocthay vìtextwrap.dedent


5
Lưu ý: inspect.cleandoclà đẹp hơn một chút so với textwrap.dedent, vì nó không đòi hỏi dòng đầu tiên để có sản phẩm nào với một nhân vật tiếp tục dòng ở cuối.
ShadowRanger

2
@ShadowRanger Wow Tôi chưa bao giờ sử dụng cleandoc trước đây. Tôi đã cập nhật câu trả lời của tôi và sẽ sử dụng trong tương lai inspect.cleandoccho việc này.
Christopher Bruns

23

Trong Python> = 3.6, bạn có thể sử dụng chuỗi ký tự được định dạng (chuỗi 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}'''

4
Chuỗi f sẽ hoạt động như thế nào nếu tôi muốn ghi lại kết quả của chuỗi nhiều dòng và không có các tab / khoảng trắng bên trái được hiển thị?
kuanb

7
Vẫn dễ bị tấn công SQL
Trenton

19

Ví dụ:

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'

Nếu giá trị của điều kiện phải là một chuỗi, bạn có thể làm như thế này:

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

Tôi tìm thấy textwrap.dedenttốt nhất cho chuỗi dài như được mô tả ở đây :

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

1
Tôi thích dấu gạch chéo màu đen ngăn chặn dòng tự động mới, cảm ơn rất nhiều!
zyy

12

Những người khác đã đề cập đến phương thức dấu ngoặc đơn, nhưng tôi muốn thêm rằng với dấu ngoặc đơn, cho phép nhận xét nội tuyến.

Nhận xét về từng mảnh:

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

Bình luận không được phép sau khi tiếp tục:

Khi sử dụng tiếp tục dòng dấu gạch chéo ngược ( \), các bình luận không được phép. Bạn sẽ nhận được một SyntaxError: unexpected character after line continuation characterlỗi.

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

Nhận xét tốt hơn cho chuỗi Regex:

Dựa trên ví dụ từ https://docs.python.org/3/l 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

Cá nhân tôi thấy sau đây là cách tốt nhất (đơn giản, an toàn và Pythonic) để viết các truy vấn SQL thô trong Python, đặc biệt là khi sử dụng mô-đun sqlite3 của 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 = ?
        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

Ưu

  • Mã gọn gàng và đơn giản (Pythonic!)
  • An toàn từ SQL tiêm
  • Tương thích với cả Python 2 và Python 3 (rốt cuộc là Pythonic)
  • Không cần nối chuỗi
  • Không cần phải đảm bảo rằng ký tự bên phải của mỗi dòng là khoảng trắng

Nhược điểm

  • Do các biến trong truy vấn được thay thế bởi ?trình giữ chỗ, nên có thể hơi khó theo dõi biến nào ?sẽ được thay thế bằng biến Python nào khi có nhiều biến trong truy vấn.

Lưu ý, tôi chưa kiểm tra điều này, nhưng bạn có thể tránh nhầm lẫn dấu hỏi bằng cách thay thế chúng bằng "{0} {1} {2}" ở những nơi có liên quan và sau đó thay đổi dòng cuối cùng thành cursor.execute(query.format(vars)). Điều đó sẽ chăm sóc "con" duy nhất của bạn (tôi hy vọng).
Ben

Có, sử dụng formatsẽ tốt nhưng tôi không chắc liệu chuỗi truy vấn được định dạng theo cách đó có an toàn không khi tiêm SQL.
Faheel

Vâng, đó là một điểm công bằng và nó chắc chắn có thể có một chút khó khăn. Có lẽ thử nghiệm nó trên một cái gì đó hoàn toàn có thể sử dụng sẽ là khôn ngoan ... không còn nghi ngờ gì nữa. Khoa học. sinh viên sẽ đi lang thang quá sớm. ;)
Ben

2
@Ben nếu bạn cursor.execute(query.format(vars))không thu lợi từ các báo cáo đã chuẩn bị nữa nên bạn dễ gặp phải nhiều vấn đề, bắt đầu với thực tế là nếu các tham số không chỉ là số bạn cần trích dẫn chúng trong truy vấn SQL.
Patrick Mevzek

4

Tôi thường sử dụng một cái gì đó như thế này:

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

Nếu bạn muốn xóa các khoảng trống khó chịu trong mỗi dòng, bạn có thể làm như sau:

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

2
Nhìn vào textwrap.dedentchức năng của Python , trong thư viện chuẩn, nó có chức năng bạn cần.
bjd2385

@ bjd2385: inspect.cleandocđẹp hơn một chút (ít tinh tế hơn về việc liệu văn bản có xuất hiện trên cùng một dòng với dấu ngoặc kép hay không, không yêu cầu các ký tự tiếp tục dòng rõ ràng).
ShadowRanger

3

Mã thực tế của bạn không hoạt động, bạn đang thiếu khoảng trắng ở cuối "dòng" (ví dụ role.descr as roleFROM...:)

Có ba chuỗi cho chuỗi đa dòng:

string = """line
  line2
  line3"""

Nó sẽ chứa các ngắt dòng và khoảng trắng thừa, nhưng đối với SQL đó không phải là vấn đề.


3

Bạn cũng có thể đặt câu lệnh sql trong một tệp riêng biệt action.sqlvà tải nó trong tệp py với

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

Vì vậy, các câu lệnh sql sẽ được tách ra khỏi mã python. Nếu có các tham số trong câu lệnh sql cần điền từ python, bạn có thể sử dụng định dạng chuỗi (như% s hoặc {field})


3

"À la" Scala way (nhưng tôi nghĩ là cách pythonic nhất theo yêu cầu của OQ):

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ếu bạn muốn str cuối cùng không có dòng nhảy, chỉ cần đặt \nở đầu của đối số thứ nhất của thay thế thứ hai:

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

Lưu ý: đường trắng giữa "... mẫu." và "Ngoài ra, ..." yêu cầu một khoảng trắng sau |.


3

tl; dr: Sử dụng """\"""để quấn chuỗi , như trong

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

Từ tài liệu chính thức về trăn :

Chuỗi ký tự có thể trải dài trên nhiều dòng. Một cách là sử dụng ba dấu ngoặc kép: "" "..." "" hoặc '' '...' ''. Cuối dòng được tự động đưa vào chuỗi, nhưng có thể ngăn chặn điều này bằng cách thêm \ ở cuối dòng. Ví dụ sau:

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

tạo đầu ra sau (lưu ý rằng dòng mới ban đầu không được bao gồm):

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

2

Hãy thử một cái gì đó như thế này hy vọng nó hoạt động, như trong định dạng này, nó sẽ trả về cho bạn một dòng liên tục như bạn đã hỏi thành công về tài sản này '

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

1

Tôi sử dụng hàm đệ quy để xây dựng các Truy vấn SQL phức tạp. Kỹ thuật này thường có thể được sử dụng để xây dựng các chuỗi lớn trong khi vẫn duy trì khả năng đọc mã.

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

PS: Hãy xem thư viện python-sqlparse tuyệt vời để in các truy vấn SQL đẹp nếu cần. http://sqlparse.readthedocs.org/en/latest/api/#sqlparse.format


"Hàm đệ quy" không phải là lambda sao?
m3nda

1

Một tùy chọn khác mà tôi nghĩ là dễ đọc hơn khi mã (ví dụ biến) được thụt lề và chuỗi đầu ra phải là một lớp lót (không có dòng mới):

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

Sử dụng ba dấu ngoặc kép. Mọi người thường sử dụng những thứ này để tạo ra các tài liệu khi bắt đầu các chương trình để giải thích mục đích của họ và các thông tin khác liên quan đến việc tạo ra nó. Mọi người cũng sử dụng chúng trong các chức năng để giải thích mục đích và ứng dụng của các chức năng. Thí dụ:

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

Tôi thích cách tiếp cận này vì nó đặc quyền đọc. Trong trường hợp chúng ta có chuỗi dài thì không có cách nào! Tùy thuộc vào mức độ thụt lề mà bạn tham gia và vẫn giới hạn ở 80 ký tự trên mỗi dòng ... Chà ... Không cần phải nói gì thêm. Theo quan điểm của tôi, hướng dẫn phong cách python vẫn còn rất mơ hồ. Tôi đã sử dụng phương pháp @Eero Aaltonen vì nó đặc quyền đọc và lẽ thường. Tôi hiểu rằng hướng dẫn phong cách sẽ giúp chúng tôi và không làm cho cuộc sống của chúng tôi trở nên lộn xộn. Cảm ơn!

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

Từ tài liệu chính thức về trăn :

Chuỗi ký tự có thể trải dài trên nhiều dòng. Một cách là sử dụng ba dấu ngoặc kép: "" "..." "" hoặc '' '...' ''. Cuối dòng được tự động đưa vào chuỗi, nhưng có thể ngăn chặn điều này bằng cách thêm \ ở cuối dòng. Ví dụ sau:

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

tạo đầu ra sau (lưu ý rằng dòng mới ban đầu không được bao gồm):


0

Để xác định một chuỗi dài bên trong một dict, giữ các dòng mới nhưng bỏ qua các khoảng trắng , cuối cùng tôi đã xác định chuỗi trong một hằng số như thế này:

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

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

0

Là một cách tiếp cận chung cho các chuỗi dài trong Python, bạn có thể sử dụng ba dấu ngoặc kép splitjoin:

_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())

Đầu ra:

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

Đối với câu hỏi của OP liên quan đến truy vấn SQL, câu trả lời dưới đây bỏ qua tính chính xác của phương pháp này để xây dựng các truy vấn SQL và chỉ tập trung vào việc xây dựng các chuỗi dài theo cách dễ đọc và thẩm mỹ mà không cần nhập thêm. Nó cũng bỏ qua tải tính toán đòi hỏi này.

Sử dụng ba dấu ngoặc kép, chúng tôi xây dựng một chuỗi dài và có thể đọc được, sau đó chúng tôi chia thành một danh sách bằng cách split()tước bỏ khoảng trắng và sau đó nối nó lại với nhau ' '.join(). Cuối cùng, chúng tôi chèn các biến bằng cách sử dụng format()lệnh:

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)

Sản xuất:

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

Chỉnh sửa: Cách tiếp cận này không phù hợp với PEP8 nhưng đôi khi tôi thấy nó hữu ích


-7

Nói chung, tôi sử dụng listjoincho các bình luận / chuỗi nhiều dòng.

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)

bạn có thể sử dụng bất kỳ chuỗi nào để tham gia tất cả thành phần danh sách này như ' \n' (dòng mới) hoặc ' ,' (dấu phẩy) hoặc ' ' (dấu cách)

Chúc mừng .. !!


1
Tại sao bạn ít nhất sẽ sử dụng một mảng bằng chữ?
Alexander - Tái lập Monica

1
Mảng được đại diện bởi danh sách lớp. kiểm tra một cuộc thảo luận khác liên quan đến các mảng chữ
paone

Tôi cho rằng điều này hoạt động, nhưng bạn nên suy nghĩ về hiệu suất và khả năng đọc ...
Petro
Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.