【问题标题】:Why are braces allowed in this Python code?为什么此 Python 代码中允许使用大括号?
【发布时间】:2018-03-26 16:17:52
【问题描述】:

Python 从未使用大括号来定义代码块,而是依赖缩进;这是该语言的定义特征之一。 CPython 甚至提供了一个小 cookie 来展示他们对此的强烈感受:

>>> from __future__ import braces
SyntaxError: not a chance

当我看到这个小sn-p 发布到论坛(已删除)时,我认为它不可能工作。但确实如此!

>>> def hi(): {
    print('Hello')
    }

>>> hi()
Hello

当这段代码似乎违反语言语法时,为什么它会起作用?

【问题讨论】:

  • 我投票决定将此问题作为离题结束,因为它属于关于 Python 中大括号的数十个其他线程中的任何一个的额外答案,例如stackoverflow.com/questions/118643/… ... 尤其是当它被同一个用户提出并立即回答时,这意味着它更像是一种好奇心,而不是描述真实问题的真实文件。
  • @ely 其他问题是关于为什么大括号不允许。如果您发现有人问他们为什么被允许,那将是重复的。
  • @MarkRansom 我没有说它是重复的。答案应该只是对如何 使用大括号进行缩进的问题的补充说明。这些问题不是在问为什么不允许使用大括号,而是在问如何使用大括号。所以有效的答案是使用第三方扩展,比如 pybraces,或者这个答案,但它显然不是一个单独的问题。
  • @MarkRansom 我认为这个问题的意图(询问这种特定的大括号出现)已经很清楚了——而且这个特定的问题只是被现有的关于有效使用 curly 的问题所包含大括号,表面上模拟了其他语言的代码块的想法。换句话说,被问到的问题(为什么大括号的一种特定语法使用似乎有效)应该关闭,因为它显然不是与该主题的许多其他线程分开的问题。只是我的意见。

标签: python curly-braces


【解决方案1】:

大括号没有像在其他语言中那样定义代码块——它们定义了set。正在评估 print 函数,并将其返回值 (None) 放入集合中。一旦创建了集合,它就会立即被丢弃,因为它没有被分配给任何东西。

这里有几个 Python 语法特性正在被利用。首先,Python 允许在: 之后立即出现单语句代码块。其次,在某些情况下,一个表达式可以跨越多行。

如果块的主体超过一行,或者尝试了除函数调用之外的赋值或语句,则此代码将不起作用。

为了更清楚地了解正在发生的事情,我们对函数进行了重做:

>>> def hi2(): print(
    { print('Hello') }
    )

>>> hi2()
Hello
{None}

【讨论】:

    猜你喜欢
    • 2018-07-29
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2022-01-08
    • 2015-05-19
    • 1970-01-01
    相关资源
    最近更新 更多