在Python中不能使用花括号是真的吗?

67
我在阅读时得知Python通过缩进来表示所有的“代码块”,而不是使用花括号。这是正确的吗?所以函数、if语句和类似的东西都不需要用花括号将它们的代码块包围起来吗?

7
https://dev59.com/9nNA5IYBdhLWcg3wVcP6 - Skilldrick
13
事实上,Python支持花括号、BEGIN/END以及几乎任何其他语言的块结构。请参见http://www.python.org/doc/humor/#python-block-delimited-notation-parsing-explained! - Alok Singhal
45
“没有问题太菜鸟”(来自 SO FAQ 的引用)。SO 是关于可以回答的问题。我认为这两个都是正确的。也许对于 Python 程序员来说,这是一个微不足道的问题,但又怎样呢?其他人问“如何从时间戳中获取秒数”或“什么是十六进制数”,也没有人抱怨。 - Abel
16
我同意这不是一个坏问题。 是的,答案可以在文档中找到,但许多Stack Overflow的问题也可以在文档中找到答案。 初学Python的人经常对缺少大括号感到疑惑,为什么不回答这个问题以便提供最佳答案呢? - Ned Batchelder
6
@Ned Batchelder:“为什么”问题很少有帮助。然而,在这种情况下,它只是一个事实的确认。对于事实确认的问题来说,Stack Overflow并不是一个很好的使用场所。 - S.Lott
显示剩余2条评论
15个回答

100

你可以尝试使用future import语句来添加对大括号的支持,但是目前还不支持,因此会出现语法错误:

>>> from __future__ import braces
  File "<stdin>", line 1
SyntaxError: not a chance

21
对于任何想知道的人,这个重要声明是一个彩蛋。Python 开发人员的例外是他们说“不行,永远不会添加它”。 - Allison

44
在Python中,用花括号来定义字典是正确的方式。
a_dict = {
    'key': 'value',
}

8
最后加句"啊~"就好了,加一分赞 :-) - Benj
2
我们甚至不能在注释开头加上+1了,哈哈,试试看... - Benj

31

可以。花括号不使用。相反,您可以使用:符号引入新的代码块,如下所示:

if True:
    do_something()
    something_else()
else:
    something()

12
如何结束一个代码块? - Jonny
2
你可能想要重写函数名称以符合PEP 8标准。对于新手问题,应该用最好的示例来回答。 - dnevins
11
块的结束是隐式的,通过减少一级缩进来实现 - 也就是说,当您将缩进级别减少一个时。没有明确的字符用于标记块的结尾。这意味着与例如C语言不同,在相同级别下不能有多个块,因为这会产生歧义。 - Lucas Jones

19

Python with Braces是Python的一个变体,让你可以做到这一点。 这是我最近和我的朋友一起合作开展的项目。


3
链接已经失效了。是否有其他链接(或者您找到的其他可以完成相同任务但更稳定的项目)? - Piyush Soni
https://github.com/mathialo/bython 可能吗? 然而,所有这些预处理器都有一个大问题——无法定义大括号字典(尽管从代码范围基本上很容易区分)。 - undefined

14

1
请注意,在Whython中您不能将语句嵌套到任意深度。例如,if块不能包含另一个if块。 - Asad Saeeduddin
@AsadSaeeduddin 这是一件好事。来自Python之禅的内容:“扁平化比嵌套更好。” - Joschua
1
@Joschua,我仍然希望你能够嵌套语句。 - Benj

13
是的,这是真的。
而且在4个空格和一个制表符之间通常有区别,所以请确保统一使用。

7
强烈建议使用四个空格代替制表符,如果你目前使用的是制表符,请改变旧习惯 :) - Jordan Messina
16
我绝不会为了空格而更改选项卡。在过去的10年里,我所写的所有代码都使用制表符缩进,并没有任何问题。 - Jonny
14
我不同意,而且非常不同意。对于缩进的目的,制表符比空格更为优越。我知道Python官方推荐使用空格,但我希望不是这样。 - antred
5
@JordanMessina 使用4个空格比使用制表符会增加文件大小4倍,而且制表符在任何地方都可以使用,不需要使用配置好的编辑器将制表符替换为4个空格。这些都是使用制表符进行缩进的好理由,而不是使用空格。 - baptx
1
只有新手才会使用空格缩进。很快你就会意识到,使用制表符可以让文件大小变小,代码导航更快。 - ekerner

8
>>> from __future__ import braces
  File "<stdin>", line 1
SyntaxError: not a chance

这解释了很多问题。
但需要注意的是,Python原生支持花括号代码块!请看下面:

if x: #{
    x += 1
#}

对于Ada或Pascal程序员,我很高兴向您透露:

if x: #BEGIN
    ...
#END

来源于文档

Python的解析器还足够复杂,可以识别混合标记,并且甚至会捕捉缺少开头或结尾分隔符的情况,并为用户纠正程序。这允许以下内容被识别为合法的Python代码:

if x: #BEGIN
     x = x + 1
#}

对于Bash用户来说:

if x:
    x=99
#fi

更好的是,对于熟悉C、C++等编程语言的程序员,你可以完全省略花括号,仅针对一条语句进行操作:
if x:
    do_stuff()

很好。正如之前提到的,Python还可以自动更正具有不正确分隔符的代码,因此以下代码也是合法的:

if x:
    do_a_hundred_or_more_statements()
    x = x + 1
    print(x)



由于这一点,它肯定会让你更加热爱Python。我在文档中留下最后一句话送给你。

从这一系列的例子中可以看出,Python已经将解析器技术和代码识别能力推进到了远远超越传统语言的前沿水平。它以一种精心平衡好的编程风格与老程序员需要用舒适的语言语法来编写代码之间的需求。

唯一的限制是这些特殊分隔符必须在一个井号符号的前面。


1
非常有趣。并没有。 - alelom
3
那是Snarkoverflow。 - ATL_DEV

7
是的。
if True:
    #dosomething
else:
    #dosomething else

#continue on with whatever you were doing

基本上,无论你原来在哪里使用开括号,现在都需要使用冒号。取消缩进以关闭该区域。不需要很长时间就能感觉完全自然。


无法轻松剪切粘贴、自动重新缩进和移动代码块,这一切与"自然"无关。所需的缩进是一种障碍。诊断意外缩进比定位括号不匹配更加困难,因为任何典型的代码编辑器都可以通过正确的自动重新缩进来明显显示括号错误。缩进也很容易破坏且难以调试。去掉分号已足够强制可读的代码。唠叨唠叨。 - Paul
无法轻松剪切粘贴、自动重新缩进和移动代码块,这并不是什么“自然”的事情。必须缩进是一种障碍。诊断意外缩进比定位大括号不匹配要困难得多,因为任何典型的代码编辑器都可以通过正确的自动重新缩进来明显显示大括号错误。缩进也很容易破坏,难以调试。去掉分号就足以实现可读的代码。唠叨唠叨。 - undefined

6

Python 不使用花括号来表示代码块:

>>> while True {
  File "<stdin>", line 1
    while True {
               ^
SyntaxError: invalid syntax

>>> from __future__ import braces
  File "<stdin>", line 1
SyntaxError: not a chance

(注意“不可能的机会”信息-这是反映这种设计决策的彩蛋。)
作为一门旨在易于使用和阅读的语言,Python使用冒号和缩进来指定代码块。通过缩进来定义代码块是不寻常的,对于习惯于像C++和C#等语言的程序员来说,可能会感到惊讶,因为这些语言并不关心额外的空格或缩进。此规则旨在增加Python代码的可读性,代价是程序员使用不同数量的空格的自由度受到了一定程度的限制。
增加缩进级别表示代码块的开始,而减少缩进则表示代码块的结束。按照惯例,每个缩进宽度为四个空格。
以下是一个简单的示例,它将从0到9之间的所有整数相加。请注意,Python中的范围包括第一个值,但不包括最后一个值:
j = 0
for i in range(0, 10):
    j += i
print(j)

6

是的,你可以使用这个库/包{ Py }。 使用花括号代替缩进,还增加了更多糖来改进Python的语法。

https://pypi.org/project/brackets/

// Use braces in Python!

def fib(n) {
  a, b = 0, 1
  while (a < n) {
    print(a, end=' ')
    a, b = b, a+b
  }
  print()
}

/*
  Powerful anonymous functions
*/

print([def(x) {
  if(x in [0, 1]) {
    return x
  };
  while (x < 100) {
    x = x ** 2
  };
  return x
}(x) for x in range(0, 10)])

6
很遗憾,那个项目已经在2018年停止了。下面是目前正在活跃的项目。 https://github.com/raptor4694/PyJava - Damian

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接