【问题标题】:Syntax quirks or why is that valid python语法怪癖或为什么是有效的python
【发布时间】:2010-12-28 18:47:09
【问题描述】:

在 python 2.6 中,为什么以下行有效?

my_line = 'foo' 'bar'

如果这是有效的,为什么不是以下内容:

my_list = 1 2 

第一个例子是字符串连接,但是,下面的例子也是无效的(感谢上帝):

foo = 'foo'
bar = 'bar'
foo_bar = foo bar

【问题讨论】:

  • 我没有看到像您的 my_list= 1 2 示例所暗示的那样“删除”空格的意义。
  • 它不建议这样做。我的建议是 Python 语法的这方面不一致(恕我直言)。
  • 查看此 PEP python.org/dev/peps/pep-3126 对其进行了广泛讨论。
  • 在任何语言中,我怀疑 5 * 10 是有效的,但 "foo" * "bar" 不是。这会导致语言不一致吗?即使是这样,那又有什么关系呢?

标签: python syntax


【解决方案1】:

这是在做string literal concatenation。如文档中所述,优势包括:

此功能可用于减少 拆分所需的反斜杠数 长字符串方便地跨越长 行,甚至添加 cmets 到 部分字符串...

继续注意,这种连接是在编译时完成的,而不是在运行时完成的。

PEP 3126 中描述了这背后的历史和理由,以及被拒绝的删除该功能的建议。

【讨论】:

    【解决方案2】:

    my_line = 'foo' 'bar' 是字符串连接。

    【讨论】:

    • @Ipthnc 我也是。幸运的是我没有遇到过这样写的代码,我希望我永远不必……我相信我会忘记这到底是什么意思!
    • C 和 C++ 也这样做。我不知道 Python 有什么真正的好理由有同样的怪癖。在这种特殊情况下,'foo' + 'bar' 编译为完全相同的字节码,但 IIRC 字节码编译器不会始终添加常量折叠字符串。
    • @Jason,我认为这是错误的,因为这是在编译时完成的,而不是在运行时完成的。请参阅我的答案以获取显示拥有此功能的充分理由的链接。
    • 这样您就可以跨多行拆分字符串。您可以执行类似my_str = ('A really long string that's hard to fit on a line ' \n 'combined with another really long string on another line.') 之类的操作(无法在 cmets 中进行正确格式化,但可以想象它跨越两行。)它实际上非常有用并且在 Python 源代码中相当普遍。不管怎样,C/C++ 允许相同类型的自动字符串连接。
    • @jldupont,三引号字符串的一个缺点是它们包含来自任何缩进的空格。这通常会迫使您将其中的所有内容左对齐,这通常会破坏读者的代码“流”。我对多行常量使用三引号字符串,在类或函数之外定义,但在其中我通常更喜欢字符串连接方法。
    【解决方案3】:

    也许这是 C 的祖先。在 C 中,以下是完全有效的:

    char* ptr = "hello " "world";
    

    它由 C pre-processor (cpp) 实现,该链接中给出的基本原理是:

    这允许拆分长字符串 在多行,并且还允许 由 C 产生的字符串文字 预处理器定义和宏是 在编译时附加到字符串

    【讨论】:

      【解决方案4】:

      这并不矛盾。字符串和整数有不同的方法。

      整数连接没有意义。

      字符串连接是一种有意义的默认行为。

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2017-11-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多