string加變數 - python連接字串




Pythonic的方式來創建一個長的多行字符串 (10)

“拉拉” Scala的方式(但我認為是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('            | ',' ')

如果你想要沒有跳線的最後一個str,只需在第二個替換的第一個參數的開始處放置\n

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

注意:“...模板”之間的白線。 和“另外...”在|之後需要空格 。

我有一個很長的查詢。 我想用Python分幾行。 一種使用JavaScript的方法是使用幾個句子並將它們與+運算符結合起來(我知道,也許這不是最有效的方式,但我並不在乎這個階段的性能,只是代碼的可讀性)。 例:

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

你在談論多行字符串嗎? 很簡單,使用三重引號開始和結束它們。

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

您也可以使用單引號(當然在開始和結束時,其中3個),並將結果字符串s其他字符串一樣處理。

注意 :與任何字符串一樣,起始和結束引號之間的任何內容都將成為字符串的一部分,因此此示例具有前導空白(如@ root45指出的那樣)。 該字符串還將包含空白和換行符。

IE中:

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

最後,還可以像這樣在Python中構建長行:

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

在Python> = 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}'''

如果你不想要一個多行字符串,但只需要一個很長的單行字符串,你可以使用圓括號,只要確保在字符串段之間不包含逗號,那麼它就是一個元組。

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)

在你正在構建的SQL語句中,多行字符串也可以。 但是,如果多行字符串包含的額外空格將會成為問題,那麼這將是實現您想要的一種好方法。


您也可以將sql語句放在一個單獨的文件action.sql並使用它將其加載到py文件中

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

所以sql語句將從python代碼中分離出來。 如果在sql語句中有需要從python填充的參數,則可以使用字符串格式化(如%s或{field})


我個人發現以下是在Python中編寫原始SQL查詢的最佳(簡單,安全和Pythonic)方式,特別是在使用Python的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

優點

  • 簡潔的代碼(Pythonic!)
  • 從SQL注入安全
  • 兼容Python 2和Python 3(畢竟是Pythonic)
  • 不需要字符串連接
  • 無需確保每行的最右側字符都是空格

缺點

  • 由於查詢中的變量被替換為? 佔位符,可能會難以跟踪哪些內容? 將在查詢中有大量Python變量被替換。

我喜歡這種方式,因為它具有閱讀權限。 如果我們有很長的琴弦,那就沒有辦法了! 根據您所在的縮進級別,每行只能限制80個字符...呃...不需要說別的。 在我看來,Python風格指南仍然非常模糊。 我採用了@Eero Aaltonen方法,因為它具有閱讀和常識的特權。 我明白,風格指南應該幫助我們,而不是讓我們的生活變得混亂。 謝謝!

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

我發現自己對這個很滿意:

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

\打破線為我工作。 這裡是一個例子:

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




python