【问题标题】:How should I write very long lines of code?我应该如何编写很长的代码行?
【发布时间】:2010-08-03 23:21:13
【问题描述】:

如果我有很长的代码行,是否可以在下一行继续,例如:

 url='http://chart.apis.google.com/chart?chxl=1:|0|10|100|1,000|10,000|'
+ '100,000|1,000,000&chxp=1,0&chxr=0,0,' +
      max(freq) + '300|1,0,3&chxs=0,676767,13.5,0,l,676767|1,676767,13.5,0,l,676767&chxt=y,x&chbh=a,1,0&chs=640x465&cht=bvs&chco=A2C180&chds=0,300&chd=t:'

【问题讨论】:

  • 函数调用max(freq)是否返回字符串?如果不是,您可能希望先将其转换为字符串或使用字符串格式。
  • Wrap long lines in Python 的可能重复项

标签: python pep8


【解决方案1】:

我会这样写

url=('http://chart.apis.google.com/chart?chxl=1:|0|10|100|1,000|10,000|'
     '100,000|1,000,000&chxp=1,0&chxr=0,0,%(max_freq)s300|1,0,3&chxs=0,676767'
     ',13.5,0,l,676767|1,676767,13.5,0,l,676767&chxt=y,x&chbh=a,1,0&chs=640x465'
     '&cht=bvs&chco=A2C180&chds=0,300&chd=t:'%{'max_freq': max(freq)})

注意+ 不需要加入字符串。这种方式更好,因为字符串是在编译时而不是运行时连接的。

我还在您的字符串中嵌入了%(max_freq)s,这是从末尾的dict 替换的

如果你想让你的 url 处理更简单,也可以查看urllib.urlencode()

【讨论】:

    【解决方案2】:

    以后去哪里寻求帮助

    大多数这样的语法问题都在PEP 8 中处理。这个问题的答案可以参考“代码布局”一节。

    首选方式:使用(), {} & []

    来自 PEP-8:

    包装长行的首选方法是使用 Python 的隐含行 圆括号、方括号和大括号内的延续。如有必要,您 可以在表达式周围添加一对额外的括号...

    这意味着你的例子会是这样的:

    url= ('http://chart.apis.google.com/chart?chxl=1:|0|10|100|1,000|10,000|' +
          '100,000|1,000,000&chxp=1,0&chxr=0,0,' +
          max(freq) + 
          '300|1,0,3&...chco=A2C180&chds=0,300&chd=t:')
    

    另一种方式:使用\

    来自 PEP-8:

    ...但有时使用反斜杠看起来更好。确保缩进续行 适当的。

    url = 'http://chart.apis.google.com/chart?chxl=1:|0|10|100|1,000|10,000|' + \
          '100,000|1,000,000&chxp=1,0&chxr=0,0,' + \ 
           max(freq) + \
          '300|1,0,3&...chco=A2C180&chds=0,300&chd=t:'
    

    避免串联

    字符串格式

    在这种情况下,我们只希望在 URL 中更改一个东西:max(freq)。为了有效地将其插入新字符串,我们可以使用带有数字或命名参数的format 方法:

    url = "http://...{0}.../".format(max(freq))
    url = "http://...{max_freq}.../".format(max_freq=max(freq))
    

    【讨论】:

    • 您需要使用+ \ 还是只使用\
    • PEP 8 表示推荐的样式是在二元运算符之前中断。所以+不应该在每个换行符的开头。
    【解决方案3】:

    Python 将两个字符串文字组合在一起,所以

    >>> s = "abc" "def"
    >>> s
    'abcdef'
    

    但是如果它们在两行上就行不通,因为 Python 不知道下一行是命令的一部分。要解决这个问题,您可以使用反斜杠或括号。

    >>> s = ("hello, world"
    "!")
    >>> s
    'hello, world!'
    

    您不需要+ 将字符串连接在一起。您仍然需要它来添加像max(freq) 这样的非文字,如@9​​87654321@ 中所述。这稍微更有效,但更重要的是更清晰,并且可以对字符串的部分进行注释,如链接的 Python 文档中所示。

    【讨论】:

      【解决方案4】:

      是的,使用反斜杠 \,像这样:

      url='http://chart.apis.google.com/chart?chxl=1:|0|10|100|1,000|10,000|' + \
      '100,000|1,000,000&chxp=1,0&chxr=0,0,' + \ 
            max(freq) + '300|1,0,3&chxs=0,676767,13.5,0,l,676767|1,676767,13.5,0,l,676767&chxt=y,x&chbh=a,1,0&chs=640x465&cht=bvs&chco=A2C180&chds=0,300&chd=t:' 
      

      或者你可以用括号括起来你的表达式()

      url=('http://chart.apis.google.com/chart?chxl=1:|0|10|100|1,000|10,000|' +
      '100,000|1,000,000&chxp=1,0&chxr=0,0,' +  
            max(freq) + '300|1,0,3&chxs=0,676767,13.5,0,l,676767|1,676767,13.5,0,l,676767&chxt=y,x&chbh=a,1,0&chs=640x465&cht=bvs&chco=A2C180&chds=0,300&chd=t:') 
      

      【讨论】:

      • 请注意,如果您只是附加字符串,则不需要 +。像'foo' + 'bar' 这样的东西相当于'foo' 'bar'
      • -1 反斜杠既丑陋又邪恶。如果你不小心在反斜杠后面有一个空格,你会得到SyntaxError: unexpected character after line continuation character。加号是邪恶的——它是在运行时评估的。
      猜你喜欢
      • 1970-01-01
      • 2017-07-17
      • 1970-01-01
      • 1970-01-01
      • 2011-04-22
      • 2023-04-03
      • 1970-01-01
      • 1970-01-01
      • 2016-04-18
      相关资源
      最近更新 更多