string - python字符串拼接 - python输出字符串




Pythonic的方式来创建一个长的多行字符串 (10)

我有一个很长的查询。 我想用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

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

注意:“...模板”之间的白线。 和“另外...”在|之后需要空格 。


你在谈论多行字符串吗? 很简单,使用三重引号开始和结束它们。

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语句中,多行字符串也可以。 但是,如果多行字符串包含的额外空格将会成为问题,那么这将是实现您想要的一个好方法。


当代码(例如变量)缩进并且输出字符串应该是单行(不包括换行符)时,我认为另一个选项更具可读性:

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 

我个人发现以下是在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变量被替换。

我使用递归函数来构建复杂的SQL查询。 这种技术通常可用于构建大型字符串,同时保持代码的可读性。

# 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:看看真棒python-sqlparse库,以便在需要时打印SQL查询。 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',' ')

我喜欢这种方式,因为它具有阅读权限。 如果我们有很长的琴弦,那就没有办法了! 根据您所在的缩进级别,每行只能限制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
)
"""




python