0

我的问题很简单。

当我将长 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 指示?

4

5 回答 5

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  *
****************
"""
于 2012-10-31T19:15:02.577 回答
1

对于模块,当使用(or )re时,建议在非常复杂的正则表达式中使用多行字符串。请参阅http://docs.python.org/2/library/re.html#re.X(引文):re.VERBOSEre.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"使用正则表达式模式时的用法。

于 2012-10-31T19:54:38.513 回答
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,您不必在意。对于长正则表达式,请查看该re.VERBOSE选项,允许非重要的空格,甚至是注释。不知道xpath。

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

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

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

于 2012-10-31T20:01:20.407 回答
0

您可以转义新行。尝试:

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

这将打印为“这是一个非常长的字符串,会断行”

于 2012-10-31T18:46:29.380 回答
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
于 2012-10-31T19:23:06.103 回答