在内部包含长文本的变量上使用“”而不是“

时间:2012-10-31 18:42:56

标签: python pep8

我的问题很简单。

当我将长sql信号写入变量时,我使用以下形式:

sql = """ select a, b, c, d ,e,
          from tables where a=a and b=b and c=c and so on..
      """

但是,对if语句的变量使用这种“技术”是正确的吗?

示例1:

if message[0] == """ this is a huge message, and it will
probably break to a second line, ( i told you )
""":
    print "   alfa "
else:
    print "  omega "

示例2:

html=i.invoke_server('localhost')

doc = LH.fromstring(html)
LE.strip_tags(doc,'b')
regex ="""
//td[text()='activeThreadCount']
/following-sibling::*/text()
"""

在示例二中,我相信它可以实现PEP8所说的

regex ="""
//td[text()='activeThreadCount']
/following-sibling::*/text()
"""

代替

regex ="//td[text()='activeThreadCount']/following-sibling::*/text()"

但这是对的吗?以这种方式拆分正则表达式,xpath xpressions或其他东西?

这个问题主要是因为遵循了PEP8关于在一条线上使用最多79个字符的步骤。

如果这不是正确的方法,可以采取什么措施来遵循PEP8指示?

5 个答案:

答案 0 :(得分:1)

“”“这是一个好方法,但有时我觉得这样更好:

customMsg = "****************\n"
customMsg +="* SOME STRING  *\n"
customMsg +="****************\n"

print customMsg

****************
* SOME STRING  *
****************

注意'\ n'的用法:

它将与:

相同
customMsg ="****************\n* SOME STRING  *\n****************\n"
print customMsg

****************
* SOME STRING  *
****************

但第一个显然是

“”“示例:

customMsg ="""****************
* SOME STRING  *
****************
"""

答案 1 :(得分:1)

明确地针对re模块,当使用re.VERBOSE(或re.X)时,建议对非常复杂的正则表达式使用多行字符串。请参阅http://docs.python.org/2/library/re.html#re.X(引文):

  

此标志允许您编写看起来更好的正则表达式。模式中的空格被忽略,除非在字符类中或前面有未转义的反斜杠,并且当一行中的字符类中既不包含'#',也不包含未转义的反斜杠时,最左边的所有字符'# “通过行尾会被忽略。

     

这意味着匹配十进制数的以下两个正则表达式对象在功能上是相同的:

a = re.compile(r"""\d +  # the integral part
                   \.    # the decimal point
                   \d *  # some fractional digits""", re.X)
b = re.compile(r"\d+\.\d*")

使用正则表达式模式时请注意r"raw string"用法。

答案 2 :(得分:1)

三重引用语法非常适合嵌入需要换行符的多行文本:

message = """\
This is a multi-line message.

 + Source lines match string lines 1:1.
 + No '\\n' noise.
"""

不幸的是,如果你把它放在缩进代码的中间,每行的前导空格就成了字符串的一部分。 textwrap.dedent()节省了一天:

def f():
   """Indented docstrings look good.

   If you'll peek at f.__doc__, you'll see leading whitespace here.
   But we don't care because pydoc, doctest and other docstring-parsing
   tools are smart enough to strip it.
   """
   if X:
       print """\
Here I'm writing flush-left to avoid leading whitespace.
But this breaks the visual flow in a horrible way!
"""
   print "where am I now? how did I get here?"
   print textwrap.dedent("""\
       This is much better!  I can have the cake and eat it.
       Unlike docstrings, don't start the first line after quotes.
       """)

但是在你的所有例子中都不需要换行符 在某些情况下,比如SQL,你不在乎。对于长regexp,请查看re.VERBOSE选项,允许非重要的空格,甚至是注释。不知道xpath。

如果您关心精确的字符串,请不要使用三重引号。使用连接:

xpath = ("//td[text()='activeThreadCount']"
         "/following-sibling::*"
         "/text()")

最后,不要盲目遵循80列指南。与周围的代码和人员保持一致,但请记住,在某些情况下,长行可能实际上是最好的。例如,您希望人们阅读源点击或复制粘贴的长URL更方便。

答案 3 :(得分:0)

你可以逃脱新线路。尝试:

"This is a really long string \
that is going to break lines"

这将打印为“这是一个非常长的字符串,它将破坏行”

答案 4 :(得分:0)

我认为这是一个变体:如果你的函数变长,将它分成几部分。如果您正在创建sqlstrings,为什么不写下这样的内容:

def sqlmap(*arg):
    sql = "select * from TABLE where "
    for a,b in arg[0].items():
        op,val = b
        sql += " ".join([a,op,val])

    print '>> ',sql

conditions = {'A':['=','B']}
sqlmap(conditions) 
#output >>  select * from TABLE where A = B